C++ 中的 std::list 示例
什么是 std::list?
在 C++ 中,std::list 指的是存储容器。 std:list 允许您从任何地方插入和删除项目。 std::list 实现为双向链表。这意味着可以双向和顺序访问列表数据。
标准模板库列表不支持快速随机访问,但支持从各个方向顺序访问。
您可以将列表元素分散在不同的内存块中。顺序访问数据所需的信息存储在容器中。 std::list 可以在运行时根据需要从两端扩展和收缩。内部分配器自动满足存储要求。
在本 C++ 教程中,您将学习:
- 什么是 std::list?
- 为什么要使用 std::list?
- 列表语法
- C++ 列表函数
- 构造函数
- 容器属性
- 插入列表
- 从列表中删除
为什么使用 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() 函数。程序逻辑应添加到此函数的主体中。
- 使用一组 4 个整数创建一个名为 my_list 的列表。
- 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
- 在控制台上打印出列表的值。
- for 循环体的结尾。
- main() 函数体的结尾。
C++ 列表函数
以下是常用的 std::list 函数:
功能 说明 insert()这个函数在迭代器指向的位置之前插入一个新项目。push_back()这个函数在列表的末尾添加一个新项目。push_front()它在列表的前面添加一个新项目。pop_front()它删除列表的first item.size()这个函数确定列表元素的个数。front()确定列表的第一项。back()确定列表的最后一项。reverse()反转列表项。merge()合并两个排序列表。 构造函数
下面是头文件提供的函数列表:
- 默认构造函数 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 的空列表。
- 用一组 3 个整数创建一个名为 l1 的列表。
- 创建一个名为 l2 的列表,其中包含名为 l1 的列表中的所有元素,从头到尾。
- 使用移动语义创建一个名为 l3 的列表。列表 l3 将具有与列表 l2 相同的内容。
- 在控制台上打印名为 l 的列表的大小以及其他文本。
- 在控制台上打印一些文本。
- 创建一个名为 it 的迭代器,并用它来迭代名为 l2 的列表中的元素。
- 在控制台上打印名为 l2 的列表的元素。
- 在控制台上打印一些文本。
- 创建一个名为 it 的迭代器,并用它来迭代名为 l3 的列表中的元素。
- 在控制台上打印名为 l3 的列表的元素。
- 程序必须在成功完成后返回值。
- main() 函数体的结尾。
容器属性
以下是容器属性列表:
财产 说明 SequenceSequence 容器以严格的线性顺序对其元素进行排序。元素是通过它们在序列中的位置来访问的。双向链表每个元素都有关于如何定位前一个和下一个元素的信息。这允许插入和删除操作的恒定时间。分配器感知分配器对象用于动态修改存储大小。插入列表
我们可以使用不同的函数将值插入列表。让我们演示一下:
示例 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() 函数。程序逻辑应添加到此函数的主体中。
- 使用一组 4 个整数创建一个名为 my_list 的列表。
- 将元素 11 插入名为 my_list 的列表的前面。
- 在名为 my_list 的列表末尾插入元素 18。
- 创建一个迭代器 it 并使用它从列表 my_list 中查找元素 10。
- 使用 if 语句来确定是否找到了上述元素。
- 如果找到,则在上述元素之前插入元素 21。
- if 语句主体的结尾。
- 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
- 在控制台上打印出列表的值。
- for 循环体的结尾。
- 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() 函数。程序逻辑应添加到此函数的主体中。
- 使用一组 4 个整数创建一个名为 my_list 的列表。
- 在控制台上打印一些文本。
- 使用 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 中删除项目,我们使用 erase() 函数。
C语言