c++ - 如何在 C++11 中有效地选择标准库容器?

标签 c++ c++11 c++-faq

有一张众所周知的图片(备忘单),称为“C++ 容器选择”。这是为所需用途选择最佳容器的流程图。

有人知道是否已经有它的 C++11 版本吗?

这是上一个: eC++ Container choice

最佳答案

据我所知,但我猜它可以通过文本完成。此外,图表略有偏差,因为 list总的来说不是一个很好的容器,forward_list 也不是。 .这两个列表都是针对利基应用程序的非常专业的容器。

要构建这样的图表,您只需要两个简单的指南:

  • 首先选择语义
  • 当有多种选择时,选择最简单的

一开始担心性能通常是没有用的。只有当您开始处理几千(或更多)的项目时,大 O 考虑才会真正发挥作用。

容器有两大类:

  • Associative 容器:它们有一个 find操作
  • 简单序列容器

然后您可以在它们之上构建多个适配器:stack , queue , priority_queue .我会把适配器放在这里,它们足够专业,可以识别。


问题 1:联想 ?

  • 如果您需要通过一个键轻松搜索,那么您需要一个关联容器
  • 如果您需要对元素进行排序,那么您需要一个有序的关联容器
  • 否则,跳到问题2。

问题 1.1:有序 ?

  • 如果您不需要特定订单,请使用 unordered_容器,否则使用其传统的有序对应物。

问题 1.2:Separate Key ?

  • 如果键与值分开,使用 map , 否则使用 set

问题 1.3:重复 ?

  • 如果您想保留重复项,请使用 multi ,否则不要。

例子:

假设我有几个人,他们有一个唯一的 ID,我想尽可能简单地从其 ID 中检索一个人的数据。

  1. 我想要一个 find函数,因此是一个关联容器

1.1。我不太关心订单,因此 unordered_容器

1.2。我的 key (ID) 与其关联的值是分开的,因此是 map

1.3。 ID 是唯一的,因此不应出现重复。

最终答案是:std::unordered_map<ID, PersonData> .


问题二:内存稳定 ?

  • 如果元素在内存中应该是稳定的(即,当容器本身被修改时它们不应该四处移动),那么使用一些 list
  • 否则,跳至问题 3。

问题 2.1:哪个

  • 满足 list ;一个forward_list仅对较小的内存占用有用。

问题 3:动态大小 ?

  • 如果容器的大小已知(在编译时),并且这个大小在程序运行过程中不会改变,并且元素是默认可构造的您可以提供完整的初始化列表(使用{ ... } 语法),然后使用array .它取代了传统的C数组,但具有方便的功能。
  • 否则,跳至问题 4。

问题 4:双端 ?

  • 如果您希望能够从正面和背面移除项目,请使用 deque , 否则使用 vector .

您会注意到,默认情况下,除非您需要关联容器,否则您的选择将是vector。 .原来也是Sutter and Stroustrup's recommendation .

关于c++ - 如何在 C++11 中有效地选择标准库容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47241654/

相关文章:

c++ - 如何正确退出可能正在等待 std::condition_variable 的 std::thread?

c++ - 为什么模板只能在头文件中实现?

c++ - 什么是 move 语义?

C++11 右值和 move 语义混淆(return 语句)

c++ - 我将 ASCII 单词转换为数字,但无法解码它们。如何转换 1=a、2=b、28=ab 等? (伪代码好吧)

c++ - 什么 CMake 变量用于在 XCode 中设置 C++ 标准库?

c++ - 是否应该定义静态 constexpr 类成员变量,即使它们未被 ODR 使用?

c++ - 如何在对象容器中搜索数据成员值?

c++ - 有没有理由我们能够在类定义中定义 [static const int] 而不是其他 static const 类型?

c++ - 静态对象以及如何创建它