1. list的原理
list的底层数据结构是双向链表(环状双向链表),每插入(或删除)一个元素就需要重新申请(或释放)空间。其迭代器必须具有前移、后移的作用
list有一个重要的性质,插入操作(insert)和接合操作(splice)都不会造成原有的list迭代器失效
2. list中节点(node)
template<class T>
struct _list_node{
typedef void* void_pointer;
void_pointer prev;
void_pointer next;
T data;
}
3. 例子
3.1 相关操作
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
list<int> li;
cout << "li.size = " << li.size() << endl; // size = 0
li.push_back(1);
li.push_back(2);
li.push_back(3);
li.push_back(4);
li.push_back(5);
cout << "li.size = " << li.size() << endl; // size = 5
for(auto it = li.begin();it!=li.end();it++) // 1 2 3 4 5
{
cout << *it << " ";
}
cout << endl;
auto ite = find(li.begin(),li.end(),3);
li.insert(ite,99);
cout << "li.size = " << li.size() << endl; // size = 5
for(auto it = li.begin();it!=li.end();it++) // 1 2 99 3 4 5
{
cout << *it << " ";
}
cout << endl;
// 接合操作
int v[5] = {11,22,33,44,55};
list<int> sli(v,v+5);
li.splice(ite,sli);
cout << "li.size = " << li.size() << endl; // size = 5
for(auto it = li.begin();it!=li.end();it++) // 1 2 99 11 22 33 44 55 3 4 5
{
cout << *it << " ";
}
cout << endl;
return 0;
}
3.2 输出打印
[root@tianyiyi list]# ./list
li.size = 0
li.size = 5
1 2 3 4 5
li.size = 6
1 2 99 3 4 5
li.size = 11
1 2 99 11 22 33 44 55 3 4 5