list底层数据结构为双向链表,以结点为单位存放数据,结点的地址在内存中不连续,每次插入或删除一个元素,就增加或释放一个元素空间,占用内存比vector多
list不支持随机访问,适用于对象数量变化频繁,插入和删除频繁。随机访问元素的时间复杂度为O(n),插入删除为O(1),后两者只需要改变元素的指针
list删除迭代器时,其后面的迭代器都不会失效,将前面和后面连接起来即可。
list插入和删除数据,需要对现有数据进行遍历,但在首部插入数据,效率很高。
list的迭代器不是普通指针,因为节点在内存中不是连续存在的。它是一个结构体,内部有一个普通指针指向节点,实现递增递减、解引用、取值等运算符。
常用方法
直接赋值
1 | std::list<int> list1={5,2,4,39,1}; |
排序和反转
1 | std::list<int> list1={5,2,4,39,1}; |
merge
函数有点问题,list1.merge(list2);
应当是将list2与list1合并再排序,但是我发现list2插入到了list1中间的部分,把list1分割开了,可能是编译器的问题,最好还是不要使用。
其他
对list中连续而相同的元素去重,移除到只剩一个,不连续的不处理
clear 函数的作用是清楚整个list的所有节点, 析构节点的对象,释放节点的空间
remove 函数的作用是将数值为value的所有元素移除