list

list底层数据结构为双向链表,以结点为单位存放数据,结点的地址在内存中不连续,每次插入或删除一个元素,就增加或释放一个元素空间,占用内存比vector多

list不支持随机访问,适用于对象数量变化频繁,插入和删除频繁。随机访问元素的时间复杂度为O(n),插入删除为O(1),后两者只需要改变元素的指针

list删除迭代器时,其后面的迭代器都不会失效,将前面和后面连接起来即可。

list插入和删除数据,需要对现有数据进行遍历,但在首部插入数据,效率很高。

list的迭代器不是普通指针,因为节点在内存中不是连续存在的。它是一个结构体,内部有一个普通指针指向节点,实现递增递减、解引用、取值等运算符。

常用方法

直接赋值

1
2
3
4
5
6
7
8
9
10
11
std::list<int> list1={5,2,4,39,1};
std::list<int> list2={7,6,1,9};
cout<< list1.size()<<endl; // 5
list1 = list2; // 直接赋值
cout<< list1.size()<<endl; // 4

list<int>::iterator ite;
for(ite=list1.begin(); ite!=list1.end(); ite++)
{
cout<< *ite <<endl;
}

排序和反转

1
2
3
4
5
std::list<int> list1={5,2,4,39,1};
list1.sort();
print(list1); // 1 2 4 5 39
list1.reverse();
print(list1); // 39 5 4 2 1

merge函数有点问题,list1.merge(list2);应当是将list2与list1合并再排序,但是我发现list2插入到了list1中间的部分,把list1分割开了,可能是编译器的问题,最好还是不要使用。

其他

  • 对list中连续而相同的元素去重,移除到只剩一个,不连续的不处理

  • clear 函数的作用是清楚整个list的所有节点, 析构节点的对象,释放节点的空间

  • remove 函数的作用是将数值为value的所有元素移除