std::list 中 C++ 与例子
什么是 std::list?
In C++,std::list 指的是存储容器。std:list 允许您从任意位置插入和删除项目。std::list 实现为双向链接列表。这意味着可以双向和顺序访问列表数据。
标准模板库列表不支持快速随机访问,但支持从各个方向的顺序访问。
您可以将列表元素分散到不同的内存块中。顺序访问数据所需的信息存储在容器中。std::list 可以在运行时根据需要从两端扩展和收缩。内部分配器会自动满足存储要求。
为什么使用 std::list?
以下是使用 std::List 的原因:
- 与数组和向量等其他序列容器相比,std::list 表现更佳。
- 它们在从任何位置插入、移动和提取元素方面都有更好的性能。
- std::list 在执行此类密集操作的算法方面也表现得更好。
列表语法
要定义 std::list,我们必须导入头文件。以下是 std::list 定义语法:
template < class Type, class Alloc =allocator<T> > class list;
以下是上述参数的说明:
- T – 定义所包含元素的类型。您可以用任何数据类型替换 T,甚至是用户定义的类型。
- Alloc – 定义分配器对象的类型。默认情况下,使用分配器类模板。它依赖于值并使用简单的内存分配模型。
例子1
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; for (int x : my_list) { std::cout << x << '\n'; } }
输出:
以下是代码截图:
代码说明:
- 包含算法头文件以使用其函数。
- 包含 iostream 头文件以使用其功能。
- 包含列表头文件以使用其功能。
- 调用 main() 函数。程序逻辑应添加在此函数主体内。
- 创建一个名为 my_list 的列表,其中包含一组 4 个整数。
- 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
- 在控制台上打印出列表的值。
- 主体的结尾 for循环.
- main() 函数体结束。
C++ 列出函数
以下是常见的 std::list 函数:
功能 | 描述 |
---|---|
插() | 此函数在迭代器指向的位置前插入一个新项目。 |
推回() | 此功能在列表末尾添加一个新项目。 |
推前() | 它在列表的前面添加了一个新项目。 |
弹出前端() | 它删除列表的第一个项目。 |
尺寸() | 该函数确定列表元素的数量。 |
正面() | 确定列表的第一项。 |
背部() | To 确定列表的最后一项。 |
撤销() | 它会反转列表项。 |
合并() | 它合并两个已排序的列表。 |
构造函数
这是列表 功能 由头文件:
- 默认构造函数 std::list::list()- 它创建一个空列表,其中包含零个元素。
- 填充构造函数 std::list::list()-它创建一个包含 n 个元素的列表,并为每个元素分配一个零 (0) 值。
- 范围构造函数 std::list::list()- 创建一个包含从第一个到最后一个范围内多个元素的列表。
- 复制构造函数 std::list::list()-它创建一个列表,其中包含现有列表中每个元素的副本。
- 移动构造函数 std::list::list()- 使用移动语义创建一个包含另一个列表的元素的列表。
- 初始化列表构造函数 std::list::list()-它使用移动语义创建一个包含另一个列表的元素的列表。
例子2
#include <iostream> #include <list> using namespace std; int main(void) { list<int> l; list<int> l1 = { 10, 20, 30 }; list<int> l2(l1.begin(), l1.end()); list<int> l3(move(l1)); cout << "Size of list l: " << l.size() << endl; cout << "List l2 contents: " << endl; for (auto it = l2.begin(); it != l2.end(); ++it) cout << *it << endl; cout << "List l3 contents: " << endl; for (auto it = l3.begin(); it != l3.end(); ++it) cout << *it << endl; return 0; }
输出:
以下是代码截图:
代码说明:
- 包含 iostream 头文件以使用其功能。
- 包含列表头文件以使用其功能。
- 在代码中包含 std 命名空间以便使用其类而不调用它。
- 调用 main() 函数。程序逻辑应添加在此函数主体内。
- 创建一个名为 l 的空列表。
- 创建一个名为 l1 的列表,其中包含一组 3 个整数。
- 创建一个名为 l2 的列表,其中包含列表 l1 中的所有元素(从头到尾)。
- 使用移动语义创建一个名为 l3 的列表。列表 l3 将具有与列表 l2 相同的内容。
- 在控制台上与其他文本一起打印名为 l 的列表的大小。
- 在控制台上打印一些文本。
- 创建一个名为it的迭代器并用它来迭代名为l2的列表的元素。
- 在控制台上打印名为 l2 的列表的元素。
- 在控制台上打印一些文本。
- 创建一个名为it的迭代器并用它来迭代名为l3的列表的元素。
- 在控制台上打印名为 l3 的列表的元素。
- 程序成功完成后必须返回值。
- main() 函数体结束。
容器属性
以下是容器属性的列表:
物业 | 描述 |
---|---|
序列 | 序列容器按严格的线性顺序排列其元素。元素通过其在序列中的位置进行访问。 |
双向链表 | 每个元素都包含有关如何定位前一个和下一个元素的信息。这允许插入和删除操作在恒定时间内完成。 |
分配器感知 | 分配器对象用于动态修改存储大小。 |
插入列表
我们可以使用不同的函数将值插入列表。让我们演示一下:
例子3
#include <algorithm> #include <iostream> #include <list> int main() { std::list<int> my_list = { 12, 5, 10, 9 }; my_list.push_front(11); my_list.push_back(18); auto it = std::find(my_list.begin(), my_list.end(), 10); if (it != my_list.end()) { my_list.insert(it, 21); } for (int x : my_list) { std::cout << x << '\n'; } }
输出:
以下是代码截图:
代码说明:
- 包含算法头文件以使用其函数。
- 包含 iostream 头文件以使用其功能。
- 包含列表头文件以使用其功能。
- 调用 main() 函数。程序逻辑应添加在此函数主体内。
- 创建一个名为 my_list 的列表,其中包含一组 4 个整数。
- 将元素 11 插入到名为 my_list 的列表的前面。
- 将元素 18 插入到名为 my_list 的列表的末尾。
- 创建一个迭代器 it 并使用它从列表 my_list 中查找元素 10。
- 使用 if 语句来确定是否找到上述元素。
- 如果找到元素 21,则将元素 XNUMX 插入到上述元素之前。
- if 语句主体结束。
- 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
- 在控制台上打印出列表的值。
- 循环主体的结束。
- main() 函数体结束。
从列表中删除
可以从列表中删除项目。erase() 函数允许您从列表中删除一个项目或一系列项目。
- 要删除单个项目,只需传递一个整数位置即可。该项目将被删除。
- 要删除某个范围,请传递起始和终止迭代器。让我们演示一下。
例子4
#include <algorithm> #include <iostream> #include <list> using namespace std; int main() { std::list<int> my_list = { 12, 5, 10, 9 }; cout << "List elements before deletion: "; for (int x : my_list) { std::cout << x << '\n'; } list<int>::iterator i = my_list.begin(); my_list.erase(i); cout << "\nList elements after deletion: "; for (int x : my_list) { std::cout << x << '\n'; } return 0; }
输出:
以下是代码截图:
代码说明:
- 包含算法头文件以使用其函数。
- 包含 iostream 头文件以使用其功能。
- 包含列表头文件以使用其功能。
- 在我们的程序中包含 std 命名空间,以便使用它的类而不调用它。
- 调用 main() 函数。程序逻辑应添加在此函数主体内。
- 创建一个名为 my_list 的列表,其中包含一组 4 个整数。
- 在控制台上打印一些文本。
- 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
- 在控制台上打印出列表的值。
- for 循环主体的结束。
- 创建一个指向列表第一个元素的迭代器 i。
- 使用迭代器i指向的erase()函数。
- 在控制台上打印一些文本。
- 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
- 在控制台上打印出列表的值。这是在删除之后发生的。
- for 循环主体的结束。
- 程序成功完成后必须返回一个值。
- main() 函数体结束。
总结
- std::list 是一个存储容器。
- 它允许在任意位置以恒定时间插入和删除项目。
- 它以双链接形式实现
- std::list 数据可以双向且顺序地访问。
- std::list 不支持快速随机访问。但是,它支持从各个方向的顺序访问。
- 您可以将 std::list 的列表元素分散到不同的内存块中。
- 您可以在运行时根据需要从两端收缩或扩展 std::list。
- 要将项目插入 std::list,我们使用 insert() 函数。
- 要从 std::list 中删除项目,我们使用 eras() 函数。