Ø list
list是一种双向链表,不同于vector的连续内存存储,它在内存中以节点的形式存在,每个节点都存着指向上下节点的指针。下面我们将以存储int型元素的list为例,仔细讲解如何使用list。
---创建list---
list<int> il; //方式1,构建一个空的容器对象
list <int> ivl(2, 9); //方式2,构建一个包含2个值为9的容器对象
int a[4] = { 1, 2, 3, 4 };
list <int> il(a, a+3); //方式3,利用数组指针构建容器对象(也可以利用其它容器迭代器)
list <int> il2(il); //方式4,利用其它vector对象构建容器对象
list <int> il3 = il; //方式4的另一种写法
---插入操作---
il.push_front(2); //方式1,在队首插入一个元素
il.push_back(2); //方式2,在队尾插入一个元素
il.insert(il.begin(),5); //方式3,在指定位置插入1个元素
il.insert(il.begin()+1,3, 9); //方式4,在指定位置插入多个元素
il.emplace(il.begin(),1); //方式5,在指定位置插入1个元素(比insert效率高)
il.emplace_front(1); //方式6,在队首插入1个元素
il.emplace_back(1); //方式7,在队尾插入1个元素
---删除操作---
il.erase(il.begin()); //方式1,删除指定位置的1个元素
il.erase(il.begin(),il.begin() + 2); //方式2,删除指定位置的多个元素
il.pop_front(); //方式3,删除队首元素
il.pop_back(); //方式4,删除队尾元素
il.remove(val); //方式5,删除所有值为val的元素
il.remove_if(_Pred); //方式6,删除所有满足_Pred的元素
il.unique(); //方式7,删除连续重复元素,比如1-2-2-1,处理后变为1-2-1
il.clear(); //方式8,清空所有元素
---查看操作---
il.front(); //方式1,查看头部的元素
il.back(); //方式2,查看尾部的元素
*il.begin(); //方式3,使用迭代器查看元素
### list容器不支持随机访问!###
---遍历操作---
//从前往后遍历
for(vector<int>::iteratoriter = il.begin(); iter++; iter!= il.end()){
//dosomething
}
//从后往前遍历
for(vector<int>::iteratoriter = il.rbegin(); iter++; iter!= il.rend()){
//dosomething
}
//利用for_each进行遍历
for_each(iter.begin(),iter.end(), dosomething);
---其它操作---
il.empty(); //判断容器是否为空
il.assign(5,2); //清空所有元素,并插入5个值为2的元素
il.assign(iter1,iter2);//清空所有元素,通过迭代器或数组指针插入数据
il.merge(il2); //合并il2,并且按照增序排列,list2将被清空
il.splice(il.begin(),il2);//合并il2,il2将被清空
---注意事项---
与vector支持随机访问不同,list不支持随机访问,因为list是一种不连续内存容器。每次插入一个节点,就动态分配一个节点的空间;每次删除一个节点,就动态释放该节点的空间。
同样,由于list不会发生像vector一样的内存重新分配、搬移,所以插入和删除节点不会是之前的迭代器失效。