list 介绍
list 是双向链表的一个泛化容器,它的数据元素可通过链表指针串接成逻辑意义上的线性表。不同于采用线性表顺序存储结构的vector 和 deque 容器,list 双向链表中任一位置的元素插入和删除,都具有高效的常数阶算法时间复杂度 O(1)。查询效率低。
list 函数
创建 list 对象
- list (),构造函数是 list (const A &a = A()) 的默认调用方式
- 例如:list<int> l;
- list (size_type n)
- 例如:list <int> l(10);
- // 构造含有10个 int 元素链表 l,初始值为0.
- 例如:list <int> l(10);
- list (size_type n, const T& value)
- 例如:list <double> l(10, 9.3);
- // 构造含有10个 double 元素的链表l,初始值为9.3。
- 例如:list <double> l(10, 9.3);
- list (list const list&),拷贝函数
- 例如:list<double> l2(l);
- list (InputIterator first, InputInterator last) // 拷贝区间为[first, end)
- 例如:int iArray[] = {11, 22, 33};
- list<int> l(iArray, iArray+3);
元素的遍历访问
不能使用"[]",只能用迭代器。
- 元素的正向遍历
- iterator begin()
- iterator end()
- 例如:
- list<int>::iterator i, iend;
- iend = v.end();
- for (i = v.begin(), j = 0; i != iend; i++, j++)
- cout << "[" << j << "]= " << *i << endl;
- 元素的反向遍历
- reverse_iterator rbegin ()
- reverse_iterator rend ()
- 使用方法,同上面
元素的插入
- void push_front (const T& x)
- 在链表首位插入
- void push_back (const T&);
- 在链表尾部插入,例如:l.push_back(44);
- iterator insert (iterator pos, const T& x)
- 在第 pos 个位置插入
元素的删除
- void pop_front ()
- 删除第一个元素
- void pop_back ()
- 删除最后一个元素
- iterator erase (iterator pos)
- 删除第 pos 个元素
- iterator erase (iterator first, iterator last)
- 删除区间 [first, last) 的元素
- void clear ()
- 删除所有元素
- void remove (const T& value)
- 删除等于 value 的所有元素
- remove_if(bool Function(T& element))
- 该函数的参数是一个函数,是一个返回值为bool,参数为元素类型的一个函数
- 删除条件满足的元素 (会遍历一遍链表)
list 的交换
- void swap (list &)
list 的合并
- void splice (iterator position, list &x)
- 把链表 x 插入到当前链表的 position 位置,list 对象 x 将被清空
- void splice (iterator position, list &, iterator i)
- 将另一个链表从 i 开始的值插入到当前 list 链表中 position,将被插入的元素从原链表中删除
- void splice (iterator position, list &, iterator ibegin, iterator iend)
- 将另一个链表从 ibegin 开始到 iend 之前的值插入到当前 list 链表中 position,将被插入的元素从原链表中删除
- void merge (list &x)
- 将 list 对象 x 的链表归并到当前 list 链表中,并清空 x 的链表
- 归并的时候,按照当前元素一个一个比较并复制到当前的链表中
list 元素处理
- l.sort ()
- 对链表 l 进行归并排序,例如:
- c1.sort(); // 默认从小到大
- c1.sort(great<int>()); // 从大到小
- 对链表 l 进行归并排序,例如:
- l. unique()
- 对链表 l 进行剔除连续的元素,例如:
- l 之前:6 8 6 6 6 9 13 6
- 调用 unique() 之后: 6 8 6 9 13 6
- 对链表 l 进行剔除连续的元素,例如:
- l.unique(bool Function(T& item1, T& item2)) // 自己编写比较函数
list 的其他函数
- assign() :重新分配值
- void assign ( size_type n, const T& u ); // 重置链表为含 n 个元素,初始值都为 u
- void assign ( InputIterator first, InputIterator last ); // 重置链表为区间 [first, last)
- front ():返回第一个元素的引用
- back ():返回最后一元素的引用
- begin ():返回第一个元素的指针(iterator)
- end ():返回最后一个元素的下一位置的指针
- size ():获取链表的长度
- resize ():改变链表的长度
- reverse ():反转链表