https://www.cnblogs.com/scandy-yuan/archive/2013/01/08/2851324.html
实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。O(1)复杂度
链表list插入和删除永远是常数时间,采取动态分配不会浪费资源,
list是一个双向循环链表
非连续空间
头节点不保存数据
#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
// g++ -std=c++11 list.cc -o test && test.exe
using namespace std;
//遍历
void traverse(list<int> l)
{
for (auto it = l.begin(); it != l.end(); it++) {
cout << *it << ", ";
}
cout << endl;
}
//逆向遍历链表
void reverseTraverse(list<int> l)
{
// c.rbegin() 返回逆向链表的第一个元素,即c链表的最后一个数据的迭代器。
for (auto it = l.rbegin(); it != l.rend(); it++) {
cout << *it << ", ";
}
cout << endl;
}
int main()
{
//初始化
list<int> c0; //空链表
list<int> c1(3); //建一个含三个默认值是0的元素的链表
list<int> c2(5, 2); //建一个含五个元素的链表,值都是2
list<int> c3(c2); //建一个c2的copy链表
list<int> c4(c1.begin(), c1.end()); // 含c1一个区域的元素[_First, _Last)
// vector放到list中
vector<int> test3(10, 2);
list<int> c5(test3.begin(), test3.end());
traverse(c5);
list<int> c6{
1, 2, 3, 4, 5}; //直接初始化链表
//插入:同vector
//插入 : 第一个参数为迭代器位置,第二个参数为要插入的数值
c6.insert(c6.begin(), 1000); //在开头插入数值1000 [1000, 1, 2, 3, 4, 5]
//在指定位置插入,需要借助advance移动迭代器位置
auto it = c6.begin();
advance(it, 2); //迭代器往后移动2位
c6.insert(it, 1001); //在[2]位置插入数值1000 [1000, 1, 1001, 2, 3, 4, 5]
//删除:
//删除匹配值的所有元素
list<int> c9{
4, 2, 3, 4, 4};
c9.remove(4);//[2, 3]会删除所有值为4
//按位置删除,同vector
auto it1 = c6.begin();
advance(it1, 2);
c6.erase(it1); // 删除在[2]位置的元素,该返回值是删除元素的下一个元素的iterator位置
traverse(c6); // [1000, 1, 2, 3, 4, 5]
//头尾操作: 同vector但是可以在头部删除和插入,vector只能在尾部
c6.push_back(6);
c6.push_front(7);
traverse(c6);
cout << "begin: " << *c6.begin() << endl; // 第一个元素的iterater
cout << "end: " << *c6.end() << endl; // 最后一个元素后面一个位置的iterater,这里定位到循环到第一个元素
cout << "front: " << c6.front() << endl; // 2 第一个元素
cout << "back: " << c6.back() << endl; // 4 最后一个元素
c6.pop_back(); //弹出最后一个元素
c6.pop_front(); //弹出第一个元素
//算法:
//交换
swap(c6, c5);
//排序,不同于vector, 调用自定义的排序
c5.sort(); //按升序排列
// c5.sort(cmp);
traverse(c5);
//连接
list<int> c7{
6, 2, 3, 1, 5};
c7.splice(c7.end(), c5); //c5放到c7后面进行连接,并释放c5
traverse(c7);
// auto it2 = c7.begin();
// advance(it2, 2);
// c7.splice(it2, c5); //将c5连接在c7的第一个参数位置,释放c5
//反转链表
list<int> c8{
1, 2, 3, 4, 5};
c8.reverse(); //5, 4, 3, 2, 1,
}