List是c++很经典的容器,我们把它分的细致一点可以分文以下这些点
1、list介绍
2、list的底层结构
3、list接口使用
3.1 构造&&析构
3.1.1 构造
3.1.2 析构
3.1.3 赋值运算符重载
3.2 迭代器
3.3 容量相关
3.4 元素访问相关
3.5 修改相关
3.5.1 assign
3.5.2 头插 && 头删
3.5.3 尾插 && 尾删
3.5.4 任意位置插入
3.5.5 任意位置删除
3.5.6 swap && clear
List介绍:
std::list
是支持常数时间从容器任何位置插入和移除元素的容器。不支持快速随机访问。它通常实现为双向链表。与 std::forward_list 相比,此容器提供双向迭代但在空间上效率稍低。
在 list 内或在数个 list 间添加、移除和移动元素不会非法化迭代器或引用。迭代器仅在对应元素被删除时非法化。
std::list
满足容器 (Container) 、具分配器容器 (AllocatorAwareContainer) 、序列容器 (SequenceContainer) 及可逆容器 (ReversibleContainer) 的要求。
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
2. list的底层是双向循环链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能向前迭代,以让其更简单高效。
4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这可能是一个重要的因素)。
以上内容详解请参考c++参考文档
简单举例:
#include <iostream>
#include <list>
using namespace std;
void printList(const list<int>&L)
{
for(list<int>::const_iterator it = L.begin();it != L.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test1()
{
list<int> L1;
//尾插
L1.push_back(10);
L1.push_back(11);
L1.push_back(12);
//头插
L1.push_front(20);
L1.push_front(21);
L1.push_front(22);
printList(L1);
//尾删
L1.pop_back();
printList(L1);
//头删
L1.pop_front();
printList(L1);
//insert插入
list<int> :: iterator it = L1.begin();
L1.insert(++it,1000);
printList(L1);
//删除
it = L1.begin();
L1.erase(it);
printList(L1);
//清空
L1.clear();
printList(L1);
}
int main(int argc, char *argv[])
{
test1();
system("pause");
return 0;
}