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;
}