
艾莉丝努力练剑:个人主页
❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶
⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平
艾莉丝的简介:

艾莉丝的C++专栏简介:

目录
C++的两个参考文档
老朋友(非官方文档):cplusplus
官方文档(同步更新):cppreference
list容器文档链接:list

1 ~>初识List:特性与能力介绍
list容器文档链接:list

2 ~>list 的核心接口与基本操作
list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已 达到可扩展的能力。以下为list中一些常见的主要接口——

2.1 list:构造函数
链接:constructor

| 构造函数(constructor) | 接口说明 | 详细说明 |
|---|---|---|
| list() | 构造空的list | 创建一个不包含任何元素的空list,使用默认构造的分配器 |
explicit list(size_type n, const value_type& val = value_type()) | 构造包含n个值为val元素的list | 创建涵盖n个元素的list,每个元素都是val的副本。如果val省略,则运用value_type的默认构造函数 |
list(const list& x) | 拷贝构造函数 | 创建x的副本,包含x中所有元素的拷贝,应用x的分配器 |
template <class | 用[first, last)区间中的元素构造list | 构造包含区间[first, last)中元素副本的list。InputIterator可以是任何输入迭代器类型,区间包含first但不囊括last |
2.2 list:iterator的使用
这里大家可暂时将迭代器理解成一个指针,该指针指向list中的某个节点。
2.2.1 list iterator使用的表格总结
链接:

| 函数声明 | 接口说明 | 详细说明 |
|---|---|---|
iterator begin();const_iterator begin() const; | 返回指向list中第一个元素的迭代器 | 如果list为空,返回的迭代器等于end()。const版本用于const对象,返回的迭代器不允许修改元素值 |
iterator end();const_iterator end() const; | 返回指向list中最后一个元素下一个位置的迭代器 | 这是"尾后迭代器",不指向任何实际元素,常用于作为循环结束条件。对end()解引用是未定义行为 |
reverse_iterator rbegin();const_reverse_iterator rbegin() const; | 返回指向list中最后一个元素的反向迭代器 | 反向迭代器从尾部向头部移动。rbegin()指向最后一个元素,++rbegin()向前移动一个元素 |
reverse_iterator rend();const_reverse_iterator rend() const; | 返回指向list中第一个元素前一个位置的反向迭代器 | 反向迭代器的结束位置,不指向任何实际元素。rend()在begin()之前的位置 |

2.2.2 注意事项
1、begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动;
2、rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操控,迭代器向前移动。
2.3 list:capacity
链接:

| 函数声明 | 接口说明 | 详细说明 |
|---|---|---|
bool empty() const; | 检测list是否为空 | 如果list中不包含任何元素(size为0)则返回true,否则返回false。此操作通常很快,时间复杂度为O(1) |
size_type size() const; | 返回list中元素的数量 | 返回list当前涵盖的元素个数。在C++98中,此运行的时间复杂度为O(1),因为标准要求size()必须在常数时间内搞定 |
2.4 list:element access
链接:

| 函数声明 | 接口说明 | 详细说明 |
|---|---|---|
reference front();const_reference front() const; | 返回list的第一个元素的引用 | 未定义行为。非const版本允许修改元素值,const版本用于只读访问就是提供对list中第一个元素的直接访问。如果list为空,调用此函数 |
reference back();const_reference back() const; | 返回list的最后一个元素的引用 | 未定义行为。非const版本允许修改元素值,const版本用于只读访问就是提供对list中最后一个元素的直接访问。如果list为空,调用此函数 |
2.5 list:modifiers
链接:

| 函数声明 | 接口说明 | 详细说明 |
|---|---|---|
void push_front(const T& val); | 在list首元素前插入值为val的元素 | 将新元素插入到list的开头位置,该元素成为新的第一个元素。插入操作是常数时间复杂度O(1) |
void pop_front(); | 删除list中第一个元素 | 移除list的第一个元素。如果list为空,调用此函数是未定义行为。被删除元素的析构函数会被调用 |
void push_back(const T& val); | 在list尾部插入值为val的元素 | 常数时间复杂度O(1)就是将新元素插入到list的末尾位置,该元素成为新的最后一个元素。插入操作 |
void pop_back(); | 删除list中最后一个元素 | 移除list的末了一个元素。假如list为空,调用此函数是未定义行为。被删除元素的析构函数会被调用 |
iterator insert(iterator position, const T& val); | 在指定位置插入元素 | 在position指定的位置之前插入值为val的元素,返回指向新插入元素的迭代器。插入操作是常数时间复杂度O(1) |
iterator erase(iterator position); | 删除指定位置的元素 | 删除position位置的元素,返回指向被删除元素之后元素的迭代器。倘若删除的是最后一个元素,则返回end() |
void swap(list& x); | 交换两个list的内容 | 常数时间复杂度O(1)就是交换当前list与x的内容。此操作不会移动或拷贝元素,只是交换内部指针,因此 |
void clear(); | 清空list中的所有元素 | 移除list中的所有元素,使size()变为0。所有元素的析构函数会被调用 |
list中还有一些操作,必须用到时大家可参阅list的文档说明。
本文代码完整展示
Test.c:
// list部分内容
#include
#include
int main()
{
list lt1;
list lt2 = { 1,2,3,4,5 };
list::iterator it2 = lt2.begin();
while (it2 != lt2.end())
{
cout << *it2 << " ";
++it2;
}
cout << endl;
for (auto e : lt2)
{
cout << e << " ";
}
cout << endl;
auto pos = find(lt2.begin(), lt2.end(), 3);
if (pos != lt2.end())
{
lt2.insert(pos, 30);// pos没有失效,因为
lt2.erase(pos); // pos失效了
//cout << *pos << endl;
}
for (auto e : lt2)
{
cout << e << " ";
}
cout << endl;
jqj::vector v3 = { 10,20,30,40 };
//sort(lt2.begin(), lt2.end());// 不支持
lt2.sort();
sort(v3.begin(), v3.end());
list lt3 = { 1,2,2,3,3,2,3,4,5 };
for (auto e : lt3)
{
cout << e << " ";
}
cout << endl;
lt3.sort();
lt3.unique(); // 去重
for (auto e : lt3)
{
cout << e << " ";
}
cout << endl;
// 4这个节点挪到头位置
list lt4 = { 1,2,3,4,5 };
for (auto e : lt4)
{
cout << e << " ";
}
cout << endl;
pos = find(lt4.begin(), lt4.end(), 4);
lt4.splice(lt4.begin(), lt4.end(), pos);
for (auto e : lt4)
{
cout << e << " ";
}
cout << endl;
return 0;
}
结尾
往期回顾:
【C++STL :vector类 (二) 】C++ Vector迭代器失效避坑指南:原因与解决方案详解
结语:都看到这里啦!那请大佬不要忘记给博主来个“一键四连”哦!
博主在这里放了一只小狗,大家看完了摸摸小狗放松一下吧!
૮₍ ˶ ˊ ᴥ ˋ˶₎ა

浙公网安备 33010602011771号