《C++初阶之STL》【list容器:详解 + 实现】
- 成员函数:容器自身提供的方法(如:插入、删除、排序),用于直接操作容器,封装底层实现细节
- 非成员函数重载:定义在容器外部的通用函数(如:比较、交换等),通过重载适配容器类型,提供统一操作接口

在这里插入图片描述
1. 常见的构造

在这里插入图片描述
|
构造函数 |
功能说明 |
|---|---|
|
list() 默认构造函数 |
构造一个空的 list 容器 |
|
list(size_type n, const value_type& val = value_type()) 填充构造函数 |
构造包含 n 个值为 val 的元素的 list 容器(val 默认为类型默认值) |
|
list(const list& x) 拷贝构造函数 |
通过拷贝另一个 list 容器 x 来初始化当前 list 容器(深度复制元素) |
|
list(InputIterator first, InputIterator last) 范围构造函数 |
使用迭代器范围 [first, last) 内的元素(从 first 到 last 前一个位置)构造 list 容器 |
|
list(initializer_list<value_type> il) 初始化列表构造函数 |
通过初始化列表 ilist 中的元素直接构造 list 容器(C++11 特性) |

在这里插入图片描述
代码语言:javascript
AI代码解释
// constructing lists
#include <iostream>
#include <list>
/*--------------------使用不同构造函数创建list对象--------------------*/
int main()
{
/*--------------第一种构造函数:“默认”构造函数--------------*/
std::list<int> first; //创建空列表
/*--------------第二种构造函数:“填充”构造函数--------------*/
std::list<int> second(4, 100); //4个值为100的元素
/*--------------第三种构造函数:“范围”构造函数--------------*/
std::list<int> third(second.begin(), second.end()); //复制second的所有元素
/*--------------第四种构造函数:“拷贝”构造函数--------------*/
std::list<int> fourth(third); //复制third的所有元素
/*--------------第四种构造函数:“通过指针范围”构造函数--------------*/
//1.使用数组初始化列表
int myints[] = { 16,2,77,29 };
//2.通过指针范围构造
std::list<int> fifth(myints, myints + sizeof(myints) / sizeof(int)); //myints指向首元素,myints + 4指向尾后位置
//3.输出fifth的内容
std::cout << "fifth链表中的内容是: ";
for (std::list<int>::iterator it = fifth.begin(); it != fifth.end(); ++it)
{
std::cout << *it << ' ';
}
std::cout << '\n';
return 0;
}

在这里插入图片描述
代码案例:初始化列表(简单的了解)
代码语言:javascript
AI代码解释
#include <iostream>
using namespace std;
int main()
{
/*-------------使用 auto 关键字可以自动推导变量il的类型-------------*/
auto il1 = { 10, 20, 30 };
cout << "auto il = { 10, 20, 30 }中il的类型:" << typeid(il1).name() << endl;
cout << "auto il = { 10, 20, 30 }中il的大小:" << sizeof(il1) << endl; //输出 initializer_list 对象的大小(以字节为单位)
// 注意:
// initializer_list 本身只包含两个指针(指向数组的开始和结束)
// 因此其大小通常是指针大小的两倍(例如:在64位系统上是16字节)
// 它并不直接包含列表中的元素,元素存储在初始化列表创建的临时数组中
/*-------------显式声明一个 initializer_list 类型的变量il-------------*/
// initializer_list 是 C++ 标准库中的一种轻量级容器类型,用于表示一个“只读的临时值序列”
// 它通常用于支持使用花括号初始化列表语法来初始化对象或传递参数
initializer_list<int> il2 = { 10, 20, 30 };
cout << "initializer_list<int> il = { 10, 20, 30 }中il的类型:" << typeid(il2).name() << endl;
cout << "initializer_list<int> il = { 10, 20, 30 }中il的大小:" << sizeof(il2) << endl;
return 0;
}

在这里插入图片描述
2. 迭代器操作

在这里插入图片描述
|
函数声明 |
接口说明 |
|---|---|
|
begin |
返回指向第一个元素的迭代器 |
|
end |
返回指向末尾(最后一个元素之后)的迭代器 |
|
rbegin |
返回指向反向开头(即:最后一个元素)的反向迭代器 |
|
rend |
返回指向反向末尾(即:原第一个元素之前)的反向迭代器 |
std::list::begin

在这里插入图片描述
代码语言:javascript
AI代码解释
// list::begin
#include <iostream>
#include <list>
int main()
{
/*-----------第一阶段:使用“数组初始化列表 + 范围构造”创建一个list容器-----------*/
int myints[] = { 75,23,65,42,13 };
std::list<int> mylist(myints, myints + 5);
/*-----------第二阶段:使用“正向迭代器”遍历整个list容器-----------*/
std::cout << "mylist中的内容是:";
for (std::list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it)
{
std::cout << ' ' << *it;
}
std::cout << '\n';
return 0;
}

在这里插入图片描述
std::list::end

在这里插入图片描述
std::list::rbegin

在这里插入图片描述
代码语言:javascript
AI代码解释
// list::rbegin/rend
#include <iostream>
#include <list>
int main()
{
/*----------第一阶段:创建一个list的容器并进行初始化----------*/
std::list<int> mylist;
for (int i = 1; i <= 5; ++i) mylist.push_back(i);
std::cout << "mylist backwards:";
for (std::list<int>::reverse_iterator rit = mylist.rbegin(); rit != mylist.rend(); ++rit)
{
std::cout << ' ' << *rit;
}
std::cout << '\n';
return 0;
}

在这里插入图片描述
std::list::rend

在这里插入图片描述
3. 容量的操作

在这里插入图片描述
|
函数声明 |
接口说明 |
|---|---|
|
size() |
返回list中有效节点的个数(即:元素数量) |
|
empty() |
检测list是否为空,若为空返回 true,否则返回 false |
std::list::size

在这里插入图片描述
代码语言:javascript
AI代码解释
// list::size
#include <iostream>
#include <list>
int main()
{
std::list<int> mylist;
std::cout << "初始状态的mylist的size为:" << mylist.size() << '\n';
for (int i = 0; i < 10; i++) mylist.push_back(i);
std::cout << "尾插10个节点之后的size为:" << mylist.size() << '\n';
mylist.insert(mylist.begin(), 10, 100);
std::cout << "再在下标为10的位置插入10个节点后的size为:" << mylist.size() << '\n';
mylist.pop_back();
std::cout << "尾删一个节点之后的size为:" << mylist.size() << '\n';
return 0;
}

在这里插入图片描述
std::list::empty

在这里插入图片描述
代码语言:javascript
AI代码解释
// list::empty
#include <iostream>
#include <list>
int main()
{
std::list<int> mylist;
int sum(0); //使用“直接初始化”进行初始化,等同于:int sum = 0;
for (int i = 1; i <= 10; ++i)
{
mylist.push_back(i);
}
while (!mylist.empty())
{
sum += mylist.front();
mylist.pop_front();
}
std::cout << "从1加到的10的和为: " << sum << '\n';
return 0;
}

在这里插入图片描述
4. 访问的操作

在这里插入图片描述
|
函数声明 |
接口说明 |
|---|---|
|
front() |
返回 list 第一个节点的值的引用(不进行空容器检查) |
|
back() |
返回 list 最后一个节点的值的引用(不进行空容器检查) |
std::list::front
更多推荐



所有评论(0)