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';
	}
}

输出:

标准::列表

以下是代码截图:

标准::列表

代码说明:

  1. 包含算法头文件以使用其函数。
  2. 包含 iostream 头文件以使用其功能。
  3. 包含列表头文件以使用其功能。
  4. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  5. 创建一个名为 my_list 的列表,其中包含一组 4 个整数。
  6. 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
  7. 在控制台上打印出列表的值。
  8. 主体的结尾 for循环.
  9. 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;
}

输出:

列表构造函数

以下是代码截图:

列表构造函数

代码说明:

  1. 包含 iostream 头文件以使用其功能。
  2. 包含列表头文件以使用其功能。
  3. 在代码中包含 std 命名空间以便使用其类而不调用它。
  4. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  5. 创建一个名为 l 的空列表。
  6. 创建一个名为 l1 的列表,其中包含一组 3 个整数。
  7. 创建一个名为 l2 的列表,其中包含列表 l1 中的所有元素(从头到尾)。
  8. 使用移动语义创建一个名为 l3 的列表。列表 l3 将具有与列表 l2 相同的内容。
  9. 在控制台上与其他文本一起打印名为 l 的列表的大小。
  10. 在控制台上打印一些文本。
  11. 创建一个名为it的迭代器并用它来迭代名为l2的列表的元素。
  12. 在控制台上打印名为 l2 的列表的元素。
  13. 在控制台上打印一些文本。
  14. 创建一个名为it的迭代器并用它来迭代名为l3的列表的元素。
  15. 在控制台上打印名为 l3 的列表的元素。
  16. 程序成功完成后必须返回值。
  17. 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';
	}
}

输出:

插入列表

以下是代码截图:

插入列表

代码说明:

  1. 包含算法头文件以使用其函数。
  2. 包含 iostream 头文件以使用其功能。
  3. 包含列表头文件以使用其功能。
  4. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  5. 创建一个名为 my_list 的列表,其中包含一组 4 个整数。
  6. 将元素 11 插入到名为 my_list 的列表的前面。
  7. 将元素 18 插入到名为 my_list 的列表的末尾。
  8. 创建一个迭代器 it 并使用它从列表 my_list 中查找元素 10。
  9. 使用 if 语句来确定是否找到上述元素。
  10. 如果找到元素 21,则将元素 XNUMX 插入到上述元素之前。
  11. if 语句主体结束。
  12. 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
  13. 在控制台上打印出列表的值。
  14. 循环主体的结束。
  15. 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;
}

输出:

从列表中删除

以下是代码截图:

从列表中删除

代码说明:

  1. 包含算法头文件以使用其函数。
  2. 包含 iostream 头文件以使用其功能。
  3. 包含列表头文件以使用其功能。
  4. 在我们的程序中包含 std 命名空间,以便使用它的类而不调用它。
  5. 调用 main() 函数。程序逻辑应添加在此函数主体内。
  6. 创建一个名为 my_list 的列表,其中包含一组 4 个整数。
  7. 在控制台上打印一些文本。
  8. 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
  9. 在控制台上打印出列表的值。
  10. for 循环主体的结束。
  11. 创建一个指向列表第一个元素的迭代器 i。
  12. 使用迭代器i指向的erase()函数。
  13. 在控制台上打印一些文本。
  14. 使用 for 循环创建循环变量 x。此变量将用于迭代列表元素。
  15. 在控制台上打印出列表的值。这是在删除之后发生的。
  16. for 循环主体的结束。
  17. 程序成功完成后必须返回一个值。
  18. main() 函数体结束。

总结

  • std::list 是一个存储容器。
  • 它允许在任意位置以恒定时间插入和删除项目。
  • 它以双链接形式实现
  • std::list 数据可以双向且顺序地访问。
  • std::list 不支持快速随机访问。但是,它支持从各个方向的顺序访问。
  • 您可以将 std::list 的列表元素分散到不同的内存块中。
  • 您可以在运行时根据需要从两端收缩或扩展 std::list。
  • 要将项目插入 std::list,我们使用 insert() 函数。
  • 要从 std::list 中删除项目,我们使用 eras() 函数。