网址大全浏览器下载,东莞网站优化指导,网络推广是什么工作内容,帝国网站程序[STL]list使用 注#xff1a;本文测试环境是visual studio2019。 文章目录 [STL]list使用1. list介绍2. 构造函数3. 迭代器相关函数begin函数和end函数rbegin函数和rend函数 4. 容量相关函数empty函数size函数 5. 数据修改函数push_back函数和pop_back函数push_front函数和pop…[STL]list使用 注本文测试环境是visual studio2019。 文章目录 [STL]list使用1. list介绍2. 构造函数3. 迭代器相关函数begin函数和end函数rbegin函数和rend函数 4. 容量相关函数empty函数size函数 5. 数据修改函数push_back函数和pop_back函数push_front函数和pop_front函数insert函数和erase函数swap函数resize函数clear函数 6. 数据操作函数sort函数reverse函数merge函数unique函数remove函数splice函数 1. list介绍
list是可以在常量时间内在任意位置进行插入和删除的序列式容器并且该容器可以前后双向迭代。list的底层是双向链表结构双向链表中每个元素存储在互不相关的独立节点中在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似最主要的不同在于forward_list是单链表只能朝前迭代已让其更简单高效。与其他的序列式容器相比(arrayvectordeque)list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比list和forward_list最大的缺陷是不支持任意位置的随机访问比如要访问list 的第6个元素必须从已知的位置(比如头部或者尾部)迭代到该位置。
2. 构造函数 (1)构造函数
默认构造函数。
listint l; //创建一个空list(2)构造函数
创建一个有n个结点结点数据为val的list。
listint l(10, 66); (3)构造函数
使用迭代器构造列表。
vectorint v(10, 6);
listint l(v.begin(), v.end()); //创建一个存储int类型的链表使用v初始化数据(4)构造函数
拷贝构造函数
listint l1(10,6);
listint l2(l1); //使用l2拷贝构造l13. 迭代器相关函数
begin函数和end函数
begin函数
返回指向list第一个结点的正向迭代器。
end函数
返回指向list结尾的正向迭代器。
#include iostream
#include list
#include vector
using namespace std;
int main()
{vectorint v;v.push_back(1); //在list中尾插数据1v.push_back(2); //在list中尾插数据2v.push_back(3); //在list中尾插数据3v.push_back(4); //在list中尾插数据4listint l(v.begin(), v.end());listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; //输出为 1 2 3 4return 0;
}rbegin函数和rend函数
rbegin函数
返回指向list最后一个含有数据的结点的反向迭代器。
rend函数
指向list反向结尾的反向迭代器。
#include iostream
#include list
#include vector
using namespace std;
int main()
{vectorint v;v.push_back(1); //在list中尾插数据1v.push_back(2); //在list中尾插数据2v.push_back(3); //在list中尾插数据3v.push_back(4); //在list中尾插数据4listint l(v.begin(), v.end());listint::reverse_iterator it l.rbegin();while (it ! l.rend()){cout *it ;it;}cout endl; //输出为 4 3 2 1return 0;
}4. 容量相关函数
empty函数
判断list是否为空.
#include iostream
#include list
#include vector
using namespace std;
int main()
{listint l1;listint l2(5, 6);cout l1.empty() endl;//输出为1cout l2.empty() endl;//输出为0return 0;
}
size函数
获取list存储的结点个数。
#include iostream
#include list
#include vector
using namespace std;
int main()
{vectorint v;v.push_back(1); //在list中尾插数据1v.push_back(2); //在list中尾插数据2v.push_back(3); //在list中尾插数据3v.push_back(4); //在list中尾插数据4listint l(v.begin(), v.end());cout l.size() endl; //输出为4return 0;
}5. 数据修改函数
push_back函数和pop_back函数
push_back函数
在list结尾插入结点。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);cout l.size() endl; //输出为3return 0;
}pop_back函数
在list结尾删除结点。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);cout l.size() endl; //输出为3l.pop_back();l.pop_back();cout l.size() endl; //输出为1l.pop_back();//l.pop_back(); -- 报错 -- 没有结点可删return 0;
}push_front函数和pop_front函数
push_front函数
在list中头插结点。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_front(1);l.push_front(2);l.push_front(3);l.push_front(4);listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; // 输出为 4 3 2 1return 0;
}pop_front函数
在list中头删结点。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_front(1);l.push_front(2);l.push_front(3);l.push_front(4);listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl;l.pop_front();l.pop_front();it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; // 输出为 2 1return 0;
}insert函数和erase函数
和vector容器类似list容器也没有提供find函数而insert函数和erase函数是需要配合迭代器使用的因此需要使用算法库的find函数。 find函数查找成功会返回指向数据的迭代器失败会返回传入的last迭代器注意find函数的查找范围是从first迭代器至last迭代器前不包括last迭代器。
insert函数
功能1 在某一位置插入结点。
#include iostream
#include list
#include algorithm
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);listint::iterator pos find(l.begin(), l.end(), 2);l.insert(pos, 66);listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; //输出为1 66 2 3 4return 0;
}功能2 在某一位置插入n个存储相同数据的结点。
#include iostream
#include list
#include algorithm
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);listint::iterator pos find(l.begin(), l.end(), 2);l.insert(pos, 3, 66);listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; //输出为1 66 66 66 2 3 4return 0;
}功能3 传入其他list容器或者其他类型容器的迭代器将传入的迭代器区间内的数据插入。
#include iostream
#include list
#include algorithm
using namespace std;
int main()
{listint l1(3, 66);listint l2;l2.push_back(1);l2.push_back(2);l2.push_back(3);listint::iterator pos find(l2.begin(), l2.end(), 2);l2.insert(pos, l1.begin(), l1.end());listint::iterator it l2.begin();while (it ! l2.end()){cout *it ;it;}cout endl; //输出为1 66 66 66 2 3return 0;
}erase函数
功能1 删除迭代器指向的结点。
#include iostream
#include list
#include algorithm
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);listint::iterator pos find(l.begin(), l.end(), 2);l.erase(pos);listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; // 输出为 1 3return 0;
}功能2 将迭代器范围的结点都删除。
#include iostream
#include list
#include algorithm
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);listint::iterator start find(l.begin(), l.end(), 2);listint::iterator finish find(l.begin(), l.end(), 5);l.erase(start, finish);listint::iterator it l.begin();while (it ! l.end()){cout *it ;it;}cout endl; // 输出为 1 5return 0;
}swap函数
将两个list数据交换通过交换list指向的头结点实现。
#include iostream
#include list
using namespace std;
int main()
{listint l1(3, 66);listint l2;l2.push_back(1);l2.push_back(2);l2.push_back(3);l1.swap(l2);listint::iterator it1 l1.begin();while (it1 ! l1.end()){cout *it1 ; //输出为 1 2 3it1;}cout endl;listint::iterator it2 l2.begin();while (it2 ! l2.end()){cout *it2 ; //输出为 66 66 66it2;}cout endl;return 0;
}resize函数 如果n size, 会将结点删除至list只有n个结点由于list结点的释放成本是不高的因此不同于vector只是将末尾指向修改list会实际上的在调用resize函数时的删除结点。如果n size就将插入结点使得list有n个结点
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.push_back(5);cout l.size() endl; //输出为5l.resize(3); // n sizecout l.size() endl; //输出为3l.resize(6); // n sizecout l.size() endl; //输出为6return 0;
}clear函数
释放所有结点使得list为空链表。
#include iostream
#include list
using namespace std;
int main()
{listint l(66, 6);cout l.size() endl; // 输出为66l.clear();cout l.size() endl; // 输出为0return 0;
}6. 数据操作函数
sort函数
对list中的数据进行排序。
#include iostream
#include list
using namespace std;int main()
{listint l1;l1.push_back(2);l1.push_back(1);l1.push_back(4);l1.push_back(7);l1.push_back(5);l1.push_back(9);l1.push_back(8);l1.sort();listint::iterator it l1.begin();it l1.begin();while (it ! l1.end()){cout *it ; //输出为: 1 2 4 5 7 8 9it;}return 0;
}注 由于list是链表实现的迭代器是双向迭代器因此不能调用algorithm库内的sort函数因此需要单独设计sort函数但是list的sort函数由于结构原因导致性能不高。
reverse函数
将list内的结点逆置。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);listint::iterator it l.begin();while (it ! l.end()){cout *it ; //输出为: 1 2 3 4it;}l.reverse(); //将list逆置it l.begin();while (it ! l.end()){cout *it ; //输出为: 4 3 2 1it;}cout endl;return 0;
}merge函数
如果两个list有序并且排序方式相同可以将一个list的结点连接到另一个list上并保持有序排序方式和连接前相同。
#include iostream
#include list
using namespace std;
int main()
{listint l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);listint l2;l2.push_back(6);l2.push_back(7);l2.push_back(8);l2.push_back(9);l2.merge(l1); //将l1的结点连接到l2连接后l1为空listint::iterator it l2.begin();while (it ! l2.end()){cout *it ;it;}cout endl;return 0;
}unique函数
只能给数据有序的list进行数据去重操作如果数据无序去重操作会出现问题。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(2);l.push_back(2);l.push_back(3);l.push_back(3);l.push_back(3);l.push_back(4);l.unique(); //对list内的数据去重listint::iterator it l.begin();while (it ! l.end()){cout *it ; // 输出为: 1 2 3 4it;}cout endl;return 0;
}remove函数
查找对应的数据并进行删除操作数据存在就删除不存在不会进行任何操作。
#include iostream
#include list
using namespace std;
int main()
{listint l;l.push_back(1);l.push_back(2);l.push_back(3);l.push_back(4);l.remove(3); //删除数据为3的结点listint::iterator it l.begin();while (it ! l.end()){cout *it ; //输出为: 1 2 4it;}cout endl;return 0;
}splice函数
将以一个list的指定部分的结点转移给其他list。
#include iostream
#include list
using namespace std;int main()
{listint l1;l1.push_back(1);l1.push_back(2);l1.push_back(3);l1.push_back(4);listint l2;l2.push_back(5);l2.push_back(6);l2.push_back(9);l2.push_back(8);listint::iterator it l1.begin();l1.splice(it, l2); //将l2的所有结点转移到l1的begin位置it l1.begin();while (it ! l1.end()){cout *it ; //输出为:5 6 9 8 1 2 3 4it;}return 0;
}