【笔记】C++的list容器

前言

C++的list容器学习笔记
list容器的数据结构是链表,在C++中list是一个双向循环链表
链表的在物理存储单元上数据是不连续的
链表是由一系列结点构成的
结点是由指针域和数据域构成的

引入头文件

1
#include <list>

构造

空构造

1
list<T> l;

拷贝构造

1
list<T> l(l);

拷贝部分元素

  • [<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
it++;
it--;

通过迭代器遍历

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;
}
}

赋值

利用运算符重载赋值

1
l = l;

利用assign函数赋值

利用区间的方式赋值

<iterator_start>:开始位置迭代器
<iterator_end>:结束位置迭代器

1
l.assign(<iterator_start>, <iterator_end>);

将多个相同元素赋值

<num>:元素的个数
<element>:需要存放的元素

1
l.assign(<num>, <element>);

容量和大小的操作

判断容器是否为空

1
l.empty();

获取元素的个数

1
l.size();

重新指定容量

  • 如果扩容,会以默认值填充新的位置
  • 如果缩容,末尾的数据会被删除

<num>:新的容量

1
l.resize(<num>);

以指定元素填充新的位置

<element>:填充的元素

1
l.resize(<num>, <element>);

在头部添加数据

1
l.push_front(<element>);

在尾部添加元素

1
l.push_back(<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>);

删除容器头部元素

1
l.pop_front();

删除容器尾部元素

1
l.pop_back();

删除迭代器位置的元素

  • 返回下一个元素的位置

<iterator>:迭代器

1
l.erase(<iterator>);

删除一组元素

  • 返回下一个元素的位置

<iterator_start>:开始位置迭代器
<iterator_end>:结束位置迭代器

1
l.erase(<iterator_start>, <iterator_end>);

删除容器中所有的元素

1
l.clear();

删除所有与指定元素相同的元素

<element>:元素

1
l.remove(<element>);

通过迭代器

<value>:修改后的值

1
*it = <value>;

通过迭代器

1
*it;

获取头部元素

1
d.front();

获取尾部元素

1
d.back();

排序

  • 默认排序规则是升序
  • 所有不支持随机访问的迭代器,都不可以用标准算法,所以不能使用公共的算法,但是不支持随机访问的迭代器内部会提供一些特定的算法

升序

1
l.sort();

降序

  • 利用自定义算法,实现降序排序
1
2
3
4
5
6
7
8
// 创建一个排序规则的函数
bool method(T & t1, T & t2)
{
return T1 > T2;
}

// 在排序时指定自定义的排序规则
l.sort(method);

交换

  • 容器内数据的互换
1
l.swap(l);

反转

  • 将链表反转
1
l.reverse();

完成

参考文献

哔哩哔哩——黑马程序员