有一张众所周知的图片(备忘单),称为“C++ 容器选择”。这是为所需用途选择最佳容器的流程图。
有人知道是否已经有它的 C++11 版本吗?
这是上一个:
最佳答案
据我所知,但我猜它可以通过文本完成。此外,图表略有偏差,因为 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 中检索一个人的数据。
- 我想要一个
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/