4

【笔记】C++的list容器

 2 years ago
source link: https://feiju12138.github.io/2022/09/09/C-%E7%9A%84list%E5%AE%B9%E5%99%A8/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

引入头文件

#include <list>
list<T> l;
list<T> l(l);

拷贝部分元素

  • [<iterator_start>, <iterator_end>)区间内的元素拷贝

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

list<T> l(<iterator_start>, <iterator_end>);

将多个相同元素赋值

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

list<T> l(<num>, <element>);

定义迭代器

第一个元素的位置

list<T>::iterator it = l.front();

最后一个元素的位置

list<T>::iterator it = l.back();

迭代器递增

  • list不支持随机访问,所以只能使用自增
  • list是双向的,所以可以使用自减
it++;
it--;

通过迭代器遍历

for (list<T>::iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << endl;
}

使迭代器只读

  • 当一个函数传递的list是常量时,需要将iterator改为const_iterator
void print(const list<T> & v)
{
for (list<T>::const_iterator it = l.begin(); it != l.end(); it++)
{
cout << *it << endl;
}
}

利用运算符重载赋值

l = l;

利用assign函数赋值

利用区间的方式赋值

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

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

将多个相同元素赋值

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

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

容量和大小的操作

判断容器是否为空

l.empty();

获取元素的个数

l.size();

重新指定容量

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

<num>:新的容量

l.resize(<num>);

以指定元素填充新的位置

<element>:填充的元素

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

在头部添加数据

l.push_front(<element>);

在尾部添加元素

l.push_back(<element>);

在迭代器指向的位置添加元素

  • 返回新元素的位置

<iterator>:迭代器
<element>:元素

l.insert(<iterator>, <element>);

添加多个相同元素

<iterator>:迭代器
<num>:插入元素的个数
<element>:元素

l.insert(<iterator>, <num>, <element>);

添加一组元素

  • 将其他容器中的一组元素添加到当前元素迭代器指向的位置

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

c l.insert(<iterator>, <iterator_start>, <iterator_end>);

删除容器头部元素

l.pop_front();

删除容器尾部元素

l.pop_back();

删除迭代器位置的元素

  • 返回下一个元素的位置

<iterator>:迭代器

l.erase(<iterator>);

删除一组元素

  • 返回下一个元素的位置

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

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

删除容器中所有的元素

l.clear();

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

<element>:元素

l.remove(<element>);

通过迭代器

<value>:修改后的值

*it = <value>;

通过迭代器

*it;

获取头部元素

d.front();

获取尾部元素

d.back();
  • 默认排序规则是升序
  • 所有不支持随机访问的迭代器,都不可以用标准算法,所以不能使用公共的算法,但是不支持随机访问的迭代器内部会提供一些特定的算法
l.sort();
  • 利用自定义算法,实现降序排序
// 创建一个排序规则的函数
bool method(T & t1, T & t2)
{
return T1 > T2;
}

// 在排序时指定自定义的排序规则
l.sort(method);
  • 容器内数据的互换
l.swap(l);
  • 将链表反转
l.reverse();

哔哩哔哩——黑马程序员


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK