C++ std::list 完全指南:从入门到精通所有接口
一、list的接口


list是一个带头的双向循环链表,支持在任意位置的插入和删除操作。
1. 构造函数
//无参的构造list();//n个val去构造explicitlist(size_type n,const value_type& val =value_type(),const allocator_type& alloc =allocator_type());//用一段迭代器区间去构造template<classInputIterator>list(InputIterator first, InputIterator last,const allocator_type& alloc =allocator_type());//拷贝构造list(const list& x);//初始化列表去构造list(initializer_list<value_type> il,const allocator_type& alloc =allocator_type());
2. 赋值重载
//用另一个list对象赋值给一个list对象 list&operator=(const list& x);//用初始化列表赋值给list对象 list&operator=(initializer_list<value_type> il);
3. 迭代器
iterator begin()noexcept; const_iterator begin()constnoexcept; iterator end()noexcept; const_iterator end()constnoexcept;//反向迭代器 reverse_iterator rbegin()noexcept; const_reverse_iterator rbegin()constnoexcept; reverse_iterator rend() nothrow; const_reverse_iterator rend()const nothrow;

4. 容量
//判空boolempty()constnoexcept;//容器元素的个数 size_type size()constnoexcept;
5. 访问元素
//返回容器中第一个元素的引用 reference front(); const_reference front()const;//返回容器中最后一个元素的引用 reference back(); const_reference back()const;
6. 修改
//用一段迭代器赋值template<classInputIterator>voidassign(InputIterator first, InputIterator last);//用n个val赋值voidassign(size_type n,const value_type& val);//用初始化列表赋值voidassign(initializer_list<value_type> il);//头插voidpush_front(const value_type& val);//头删voidpop_front();//尾插voidpush_back(const value_type& val);//尾删voidpop_back();//在pos位置插入单个元素 iterator insert(const_iterator position,const value_type& val);//在pos位置插入n个val iterator insert(const_iterator position, size_type n,const value_type& val);//在pos位置插入一段迭代器区间template<classInputIterator> iterator insert(const_iterator position, InputIterator first, InputIterator last);//在pos位置插入一个初始化列表 iterator insert(const_iterator position, initializer_list<value_type> il);//删除pos位置的元素 iterator erase(const_iterator position);//删除一段迭代器区间 iterator erase(const_iterator first, const_iterator last);//交换两个list对象的内容voidswap(list& x);// n < size,保留前n个元素//n > size,插入元素到n个,如果val是具体的,就用val的拷贝去初始化,否则,将被值初始化voidresize(size_type n);voidresize(size_type n,const value_type& val);//清空list中所有的元素voidclear()noexcept





7. 操作
//在pos位置插入一个list对象voidsplice(const_iterator position, list& x);//只转移x对象中i位置的元素到另一个list对象中voidsplice(const_iterator position, list& x, const_iterator i);voidsplice(const_iterator position, list&& x, const_iterator i);//转移x中的一段迭代器区间到另一个list对象中voidsplice(const_iterator position, list& x,const_iterator first, const_iterator last);voidsplice(const_iterator position, list&& x,const_iterator first, const_iterator last);//删除容器中所有和val值相等的元素voidremove(const value_type& val);//去重,原理双指针(只能去除相邻的重复的元素,常与sort搭配使用)voidunique();//合并链表,原理归并排序(要求两个list对象都是有序的)voidmerge(list& x);//comp仿函数对象,控制比较大小的逻辑template<classCompare>voidmerge(list& x, Compare comp);//链表排序voidsort();template<classCompare>voidsort(Compare comp);//逆置链表voidreverse()noexcept;

8. 非成员函数
//友元函数(1)template<classT,classAlloc>booloperator==(const list<T,Alloc>& lhs,const list<T,Alloc>& rhs);(2)template<classT,classAlloc>booloperator!=(const list<T,Alloc>& lhs,const list<T,Alloc>& rhs);(3)template<classT,classAlloc>booloperator<(const list<T,Alloc>& lhs,const list<T,Alloc>& rhs);(4)template<classT,classAlloc>booloperator<=(const list<T,Alloc>& lhs,const list<T,Alloc>& rhs);(5)template<classT,classAlloc>booloperator>(const list<T,Alloc>& lhs,const list<T,Alloc>& rhs);(6)template<classT,classAlloc>booloperator>=(const list<T,Alloc>& lhs,const list<T,Alloc>& rhs);//交换两个list对象的内容template<classT,classAlloc>voidswap(list<T,Alloc>& x, list<T,Alloc>& y);list的接口到这里就结束了。