前言
C++的list容器学习笔记
list容器的数据结构是链表,在C++中list是一个双向循环链表
链表的在物理存储单元上数据是不连续的
链表是由一系列结点构成的
结点是由指针域和数据域构成的
引入头文件
构造
空构造
拷贝构造
拷贝部分元素
- 将
[<iterator_start>, <iterator_end>)
区间内的元素拷贝
<iterator_start>
:开始位置迭代器
<iterator_end>
:结束位置迭代器
1
| list<T> l(<iterator_start>, <iterator_end>);
|
将多个相同元素赋值
<num>
:元素的个数
<element>
:需要存放的元素
1
| list<T> l(<num>, <element>);
|
迭代器
定义迭代器
第一个元素的位置
1
| list<T>::iterator it = l.front();
|
最后一个元素的位置
1
| list<T>::iterator it = l.back();
|
迭代器递增
- list不支持随机访问,所以只能使用自增
- list是双向的,所以可以使用自减
通过迭代器遍历
1 2 3 4
| for (list<T>::iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; }
|
使迭代器只读
- 当一个函数传递的list是常量时,需要将iterator改为const_iterator
1 2 3 4 5 6 7
| void print(const list<T> & v) { for (list<T>::const_iterator it = l.begin(); it != l.end(); it++) { cout << *it << endl; } }
|
赋值
利用运算符重载赋值
利用assign函数赋值
利用区间的方式赋值
<iterator_start>
:开始位置迭代器
<iterator_end>
:结束位置迭代器
1
| l.assign(<iterator_start>, <iterator_end>);
|
将多个相同元素赋值
<num>
:元素的个数
<element>
:需要存放的元素
1
| l.assign(<num>, <element>);
|
容量和大小的操作
判断容器是否为空
获取元素的个数
重新指定容量
- 如果扩容,会以默认值填充新的位置
- 如果缩容,末尾的数据会被删除
<num>
:新的容量
以指定元素填充新的位置
<element>
:填充的元素
1
| l.resize(<num>, <element>);
|
增
在头部添加数据
1
| l.push_front(<element>);
|
在尾部添加元素
在迭代器指向的位置添加元素
<iterator>
:迭代器
<element>
:元素
1
| l.insert(<iterator>, <element>);
|
添加多个相同元素
<iterator>
:迭代器
<num>
:插入元素的个数
<element>
:元素
1
| l.insert(<iterator>, <num>, <element>);
|
添加一组元素
- 将其他容器中的一组元素添加到当前元素迭代器指向的位置
<iterator>
:迭代器
<iterator_start>
:开始位置迭代器
<iterator_end>
:结束位置迭代器
c l.insert(<iterator>, <iterator_start>, <iterator_end>);
删
删除容器头部元素
删除容器尾部元素
删除迭代器位置的元素
<iterator>
:迭代器
删除一组元素
<iterator_start>
:开始位置迭代器
<iterator_end>
:结束位置迭代器
1
| l.erase(<iterator_start>, <iterator_end>);
|
删除容器中所有的元素
删除所有与指定元素相同的元素
<element>
:元素
改
通过迭代器
<value>
:修改后的值
查
通过迭代器
获取头部元素
获取尾部元素
排序
- 默认排序规则是升序
- 所有不支持随机访问的迭代器,都不可以用标准算法,所以不能使用公共的算法,但是不支持随机访问的迭代器内部会提供一些特定的算法
升序
降序
1 2 3 4 5 6 7 8
| bool method(T & t1, T & t2) { return T1 > T2; }
l.sort(method);
|
交换
反转
完成
参考文献
哔哩哔哩——黑马程序员