List容器详解
list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。
list不可以随机存取元素,所有不支持 at.(pos) 函数和 [ ] 操作符,因此对于迭代器,只能通过“++”或“–”操作将迭代器移动到后继/前驱节点元素处。而不能对迭代器进行+n或-n的操作
如果你需要大量的插入和删除,而不关心随即存取,应该使用list容器
使用list容器之前必须加上<vector>头文件:#include <list>;
list属于std命名域的内容,因此需要通过命名限定:using std::list;
也可以直接使用全局的命名空间方式:using namespace std;
list的默认构造函数:
template <typename T> list<T> zploo; //list采用模板类实现,对象的默认构造形式 list<int> zploo; //定义一个存放int的list容器 list<float> zploo; //定义一个存放float的list容器 list<string> zploo; //定义一个存放string的list容器 /*尖括号内还可定义指针类型 或 自定义类型*/
list的带参数构造:
list.(beg,end); //构造函数 将【beg,end】区间中得元素拷贝给本身(注意:该区间是左闭右开的区间) list(n,elem); //构造函数将n个elem拷贝给本身 list(const list &zploo); //拷贝构造函数
list的头尾添加和移除操作:
list.push_back(elem); //从容器尾部添加一个元素 list.pop_back(); //删除容器中最后一个元素 list.push_front(elem); //在容器开通插入一个元素 list.pop_front(); //从容器开通移除第一个元素
list的数据存取:
list.front(); //返回第一个元素 list.back(); //返回最后一个元素
list的赋值:
list.assign(beg,end); //将【beg,end】区间中得数据拷贝赋值给本身(注意:该区间位左闭右开的区间) list.assign(n,elem); //将n个elem拷贝赋值给本身 list& operator= (const list& zploo); //重载等会操作符 list.swap(zploolist); //将zploolist于本身的元素互换
list的大小:
list.size(); //返回容器中元素的个数 list.empty(); //判断容器是否为空 list.resize(num); //重新指定容器的长度位 num ,若容器变长,则以默认值填充新位置。若容器变短,则末尾超出容器长度的元素会被删除 list.resize(num,elem); //重新指定容器的长度位 num ,若容器变长,则以elem填充新位置。若容器变短,则末尾超出容器长度的元素会被删除
list的插入和删除:
//插入 list.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置 list.insert(pos,n,elem); //在pos位置插入n个elem数据,无返回值。 list.insert(pos,beg,end); //在pos位置插入【beg,end】区间的数据,无返回值。 //删除 list.clear(); //删除容器内所有的数据 list.erase(beg,end); //删除【beg,end】区间的数据,返回下一个数据的位置 list.erase(pos); //删除pos位置的数据,返回下一个数据的位置。 list.remove(elem); //删除容器中所有与elem值匹配的元素
list的逆序排列:
list.reverse(); //反转链表,比如zploo中包含1,4,7元素,反转后变成了 7,4,1元素
练习演示代码:
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <list> using namespace std; void testList1() { list<int> l; l.push_back(2); l.push_back(3); l.push_back(4); l.push_back(5); l.push_back(7); list<int> l2; l2.push_back(12); l2.push_back(13); l2.push_back(14); l2.push_back(15); l2.push_back(17); for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; //2, 3, 4, 5, 7 l.insert(l.begin(), l2.begin(), l2.end()); //12, 13 ,14 ,15 ,17, 2, 3, 4, 5, 7 for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; l.insert(l.begin(), 8); for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; //8, 12, 13 ,14 ,15 ,17, 2, 3, 4, 5, 7 list<int>::iterator it = l.end(); l.insert( it, 10, 8); cout << "----www.zploo.com----" << endl; //删除所有8的元素 l.remove(8); for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; cout << "----www.zploo.com----" << endl; //逆序一个链表 l.reverse(); cout << "----www.zploo.com----" << endl; for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; /* list.clear(); //移除容器的所有数据 list.erase(beg,end); //删除[beg,end)区间的数据,返回下⼀个数据的位置。 list.erase(pos); //删除pos位置的数据,返回下⼀个数据的位置。 lst.remove(elem); //删除容器中所有与elem值匹配的元素。 */ l.erase(l.begin()); for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; // l.erase(l.begin(), l.end()); for (list<int>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << " "; } cout << endl; l.push_back(2); l.clear(); if (l.empty() == true) { cout << "kong " << endl; } } int main(void) { testList1(); return 0; }