list使用
list常用函数及使用(1)
list常用函数及使用(2)
-
splice
: 将一个list中的元素转移到另一个list中,不进行元素的复制或移动,而是改变节点的链接。 -
remove
: 删除list中所有与给定值匹配的元素。 -
remove_if
: 根据给定的条件删除元素。 -
merge
: 合并两个已排序的list,并清空被合并的list。 -
sort
: 对list中的元素进行排序。 -
reverse
: 反转list中元素的顺序。 -
swap
: 交换两个list的内容。 -
resize
: 调整list的大小,可以增加或减少元素数量。 -
clear
: 清空list中的所有元素。 -
rbegin
,rend
: 提供反向迭代器,用于从list的末尾向开始进行遍历。 -
cbegin
,cend
: 提供常量正向迭代器,用于从list的开始到末尾的遍历,不允许修改元素。 -
crbegin
,crend
: 提供常量反向迭代器,用于从list的末尾到开始的遍历,不允许修改元素。
list的数据结构
STL中list是使用环状双向链表实现的。它的结点结构定义如下:
可以看出list节点是一个双向链表,next指向下一个节点,prev指向前一个节点。
链表最后使用一个指针指向环形链表的空白节点,空白节点指向头节点,这样就形成了一个环了。
node是指向list节点的一个指针,可以使用这个指针表示整个环状双向链表。
如果指针node指向置于尾端的一个空白节点,node就能符合stl对于前闭后开区间的要求,这样以下函数便能轻易完成。
list的迭代器
list是一个双向链表实现的容器,元素在内存中不需要连续存放。vector
需要其元素在内存中连续存放,vector可以使用普通指针作为迭代器。
因此,list
不能使用普通指针作为迭代器,因为它需要特殊的迭代器。
list
提供的迭代器是双向迭代器(Bidirectional Iterators),允许前移和后移操作。
vector
插入操作可能会导致容器重新分配内存,这会使所有现有迭代器、引用和指针失效。
list
删除操作,只有指向被删除元素的迭代器会失效,其他迭代器仍然有效。插入不会使任何的迭代器失效。
list节点的构造和释放
默认构造函数调用empty_initialize()
来初始化链表。这个初始化函数设置了一个哨兵节点(或称为头节点),使得链表的next
和prev
指针都指向自己,表示一个空的链表。
list操作
insert:类似双向链表的插入。
erase:类似双向链表的删除。
push_front(),push_back(),pop_front(), pop_back()在insert和erase的基础上实现。
参考:
《C++ STL 源码剖析》