【C++】list使用
文章目录
- list的介绍
- list的使用
- list的构造方式
- **打印任意容器的**方法
- **list的插入和删除**
- **push_front和pop_front**
- **push_back和pop_back**
- **insert**
- 插入**是否会导致迭代器失效问题?**
- **erase**
- 删除**是否会导致迭代器失效问题?**
- **list的迭代器使用**
- **begin和end**
- **rbegin和rend**
- **list的元素获取**
- **front和back**
- **list的大小控制**
- **size**
- **resize**
- **empty**
- **clear**
- **list的操作函数**
- **sort**
- **splice**
- **remove**
- **remove_if**
- **unique**
- **merge**
- **reverse**
- **assign**
- **swap**
- **关于sort函数**
- 自定义排序方法
- **关于��代器分类**
list的介绍
- list是一种可以在常数范围内O(1)在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代(双向迭代器)
- 任意位置的插入和删除都是O(1) list的底层是双向带头循环链表
- list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立结点当中,在结点中通过指针指向其前一个元素和后一个元素,
- list与forward_list(单链表)非常相似,最主要的不同在于forward_list是单链表,只能进行单方向迭代,
- 与其他容器相比,list通常在任意位置进行插入、删除元素的执行效率更高,
- list和forward_list最大的缺陷是不支持在任意位置的随机访问,其次,list还需要一些额外的空间,以保存每个结点之间的关联信息(对于存储的类型较小元素来说这可能是一个重要的因素)
list的使用
list的构造方式
list() 构造空的list list (size_type n, const value_type& val = value_type()) 构造的list中包含n个值为val的元素 list (const list& x) 拷贝构造函数 list (InputIterator first, InputIterator last) 用[first, last)区间中的元素构造list 方式一: 构造一个某类型的空容器,
list lt1; //构造int类型的空容器
方式二: 构造一个含有n个val的某类型容器,
list lt2(10, 2); //构造含有10个2的int类型容器
方式三: 拷贝构造某类型容器的复制品,
list lt3(lt2); //拷贝构造int类型的lt2容器的复制品
方式四: 使用迭代器拷贝构造某一段内容,
string s("hello world"); list lt4(s.begin(),s.end()); //构造string对象某段迭代器区间的内容
方式五: 构造数组某段区间的内容,
int arr[] = { 1, 2, 3, 4, 5 }; int sz = sizeof(arr) / sizeof(int); list lt5(arr, arr + sz); //构造数组某段区间的复制品 ->本质是调用迭代器区间的构造函数
原生指针可以当做天然迭代器使用,本质上vector和string的迭代器就是原生指针
打印任意容器的方法
template void PrintContainer(const Con& c) { //取类模板的内嵌类型,类模板没有实例化,编译器不会去找 //前面加typename,告诉编译器这个是一个类型 typename Con::const_iterator it = c.begin(); while (it != c.end()) { cout list cout cout list cout cout list cout cout cout int a[] = { 1,2,3 }; int sz = sizeof(a) / sizeof(a[0]); list list cout cout int a[] = { 1,2,3 }; int sz = sizeof(a) / sizeof(a[0]); list // erase()函数执行后,it所指向的节点已被删除,因此it迭代器无效,在下一次使用it时,必须先给其赋值 l.erase(it); ++it; } l.erase(it++);//写法2:it = l.erase(it); } list cout list cout list list list cout cout cout list list cout cout list cout cout list cout cout cout list cout cout return val
- list是一种可以在常数范围内O(1)在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代(双向迭代器)
The End