C++ 标准模板库(STL)提供了各种容器,旨在存储数据的集合。每种容器都有其独特的特性,并针对不同的操作进行了优化。一个常见的问题是,在特定场景下应该使用哪种 STL 容器。
在本文中,我们将一起学习各种 STL 容器,了解它们的独特功能,并讨论每种容器最适合使用的具体场景。
何时应该使用哪种 STL 容器?
下面的流程图展示了在 C++ 的特定场景下,我们应该使用哪种 STL 容器。
!Adaptive-and-Unordered-Containers-in-C-STL容器适配器和无序容器的流程图
STL 提供了几种类型的容器,包括序列容器、关联容器和容器适配器。
C++ STL 中的序列容器
1. std::vector
当我们需要一个动态数组,且要求快速随机访问以及在尾部高效插入和删除时,可以使用 std::vector。
例如: 管理一个元素顺序很重要的列表,比如教室里的学生名单。
2.std::deque
当我们需要一个动态数组,且要求在头部和尾部都能高效地插入和删除元素时,可以使用 std::deque。
例如: 实现一个双端队列,其中的元素经常从两端添加或移除。
3. std::list
当我们需要一个双向链表,且要求在任何位置都能高效地插入和删除元素时,可以使用 std::list。
例如: 管理一个播放列表,其中的歌曲可以在任何位置添加或移除。
C++ STL 中的关联容器
4. std::set
当我们需要一个有序的唯一元素集合,且要求快速查找、插入和删除时,可以使用 std::set。
例如: 在字典应用程序中存储一组唯一的单词。
5. std::multiset
当我们需要一个允许出现重复元素的有序集合时,可以使用 std::multiset。
例如: 统计文本文档中单词出现的次数。
6. std::map
当我们需要一个有序的键值对集合,且键必须是唯一的,同时要求能按键快速查找时,可以使用 std::map。
例如: 存储学生 ID 及其对应的成绩。
7. std::multimap
当我们需要一个有序的键值对集合,且允许键重复时,可以使用 std::multimap。
例如: 存储学生的成绩,其中每个学生可以有多门成绩。
8. <a href="https://www.geeksforgeeks.org/cpp/unorderedset-in-cpp-stl/">std::unorderedset
当我们需要一个唯一元素的集合,且要求查找、插入和删除操作具有快速的平均时间复杂度(不进行排序)时,可以使用 std::unordered_set。
例如: 管理一组唯一标识符,其中顺序并不重要。
9. <a href="https://www.geeksforgeeks.org/cpp/cpp-unorderedmultiset/">std::unorderedmultiset
当我们需要一个允许出现重复元素的集合,且要求查找、插入和删除操作具有快速的平均时间复杂度(不进行排序)时,可以使用 std::unordered_multiset。
例如: 统计元素出现的次数,其中顺序并不重要。
10. <a href="https://www.geeksforgeeks.org/cpp/unorderedmap-in-cpp-stl/">std::unorderedmap
当我们需要一个键值对集合,且键必须是唯一的,同时要求查找、插入和删除操作具有快速的平均时间复杂度(不进行排序)时,可以使用 std::unordered_map。
例如: 使用唯一键缓存结果以便快速检索。
11. <a href="https://www.geeksforgeeks.org/cpp/unorderedmultimap-and-its-application/">std::unorderedmultimap
当我们需要一个键值对集合,且允许键重复,同时要求查找、插入和删除操作具有快速的平均时间复杂度(不进行排序)时,可以使用 std::unordered_multimap。
例如: 实现一个电话簿,其中一个人可以拥有多个电话号码。
C++ STL 中的容器适配器
12. std::stack
当我们需要一个后进先出(LIFO)的数据结构时,可以使用 std::stack。
例如: 在程序中实现函数调用栈。
13. std::queue
当我们需要一个先进先出(FIFO)的数据结构时,可以使用 std::que