C++ ique ID与它们关联,我希望尽可能简单地从ID中检索个人数据 我想要一个find函数,因此是一个关联容器
1.1。我不能不关心订单,因此是一个C++ ique ID与它们关联,我希望尽可能简单地从ID中检索个人数据 我想要一个find函数,因此是一个关联容器,c++,c++11,c++-faq,C++,C++11,C++ Faq,1.1。我不能不关心订单,因此是一个无序的容器 1.2。我的键(ID)与它关联的值分开,因此是一个map 1.3。ID是唯一的,因此不应出现重复的ID 最后的答案是:std::unordered\u map 问题2:内存稳定 如果元素在内存中应该是稳定的(即,当容器本身被修改时,它们不应该移动),那么使用一些list 否则,跳到问题3 问题2.1:哪个 满足于列表;forward\u列表仅对较小的内存占用有用 问题3:动态调整大小 如果容器具有已知的大小(在编译时),并且该大小在程
无序的容器
1.2。我的键(ID)与它关联的值分开,因此是一个map
1.3。ID是唯一的,因此不应出现重复的ID
最后的答案是:std::unordered\u map
问题2:内存稳定
- 如果元素在内存中应该是稳定的(即,当容器本身被修改时,它们不应该移动),那么使用一些
list
- 否则,跳到问题3
问题2.1:哪个
- 满足于
列表
;forward\u列表
仅对较小的内存占用有用
问题3:动态调整大小
- 如果容器具有已知的大小(在编译时),并且该大小在程序过程中不会改变,并且元素是默认可构造的,或者您可以提供完整的初始化列表(使用
{…}
语法),则使用数组
。它取代了传统的C阵列,但具有方便的功能
- 否则,跳到问题4
问题4:双端
- 如果您希望能够从正面和背面移除项目,则使用
deque
,否则使用向量
您将注意到,默认情况下,除非您需要关联容器,否则您将选择向量。事实证明也是如此。我喜欢Matthieu的答案,但我要重申流程图如下:
何时不使用std::vector
默认情况下,如果您需要一个东西容器,请使用std::vector
。因此,只有通过提供一些替代std::vector
的功能,才能证明其他每个容器都是合理的
建设者
std::vector
要求其内容是可移动构造的,因为它需要能够随意移动项目。这对内容来说不是一个可怕的负担(注意,由于emplace
等等,默认构造函数不是必需的)。但是,大多数其他容器不需要任何特定的构造函数(同样感谢emplace
)。因此,如果您有一个绝对无法实现移动构造函数的对象,那么您必须选择其他对象
std::deque
将是一般的替换,具有std::vector
的许多属性,但您只能在deque的两端插入。在中间插入需要移动。std::list
对其内容没有要求
需要胸部
std::vector
是。。。不嗯,这是标准的。但它不是通常意义上的向量
,因为std::vector
通常允许的操作是被禁止的。而且它肯定不包含bool
s
因此,如果您需要从bool
s容器中获取真实的vector
行为,那么您无法从std::vector
中获取它。因此,您必须使用std::deque
进行到期
搜索
如果您需要在容器中查找元素,并且搜索标记不能只是一个索引,那么您可能需要放弃std::vector
,转而使用set
和map
。注意关键词“可能”;排序的std::vector
有时是一种合理的选择。或者Boost.Container,它实现了一个排序的std::vector
现在有四种变体,每种变体都有自己的需求
- 当搜索标记与要查找的项目本身不同时,请使用
映射。否则,请使用设置
- 如果容器中有大量项目,并且搜索性能绝对需要是
O(1)
,而不是O(logn)
,请使用unordered
- 如果需要多个项目具有相同的搜索标记,请使用
multi
订购
如果需要根据特定比较操作对项目容器进行排序,可以使用集合
。或者,如果需要多个项目具有相同的值,则使用多个集合
或者,您可以使用已排序的std::vector
,但必须对其进行排序
稳定性
当迭代器和引用无效时,有时会引起关注。如果您需要一个项目列表,这样您就可以在其他不同的地方找到指向这些项目的迭代器/指针,那么std::vector
的无效化方法可能并不合适。根据当前大小和容量,任何插入操作都可能导致无效
std::list
提供了一个可靠的保证:迭代器及其关联的引用/指针只有在从容器中移除项本身时才会失效<代码>标准::转发列表
在内存严重问题时存在
如果这是一个太强的保证,std::deque
提供了一个较弱但有用的保证。从中间插入的失效结果,但在头部或尾部的插入只会导致迭代器失效,而不是容器中的项目的指针/引用。
插入性能
std::vector
只在末尾提供廉价的插入(即使如此,如果容量不足,插入也会变得昂贵)
std::list
在性能方面是昂贵的(每个新插入的项都需要内存分配),但它是一致的。它还提供了偶尔不可或缺的功能,可以在几乎没有性能成本的情况下随意移动项目,还可以与其他std::list
相同类型的容器交换项目
Should the container let you manage the order of the elements?
Yes:
Will the container contain always exactly the same number of elements?
Yes:
Does the container need a fast move operator?
Yes: std::vector
No: std::array
No:
Do you absolutely need stable iterators? (be certain!)
Yes: boost::stable_vector (as a last case fallback, std::list)
No:
Do inserts happen only at the ends?
Yes: std::deque
No: std::vector
No:
Are keys associated with Values?
Yes:
Do the keys need to be sorted?
Yes:
Are there more than one value per key?
Yes: boost::flat_map (as a last case fallback, std::map)
No: boost::flat_multimap (as a last case fallback, std::map)
No:
Are there more than one value per key?
Yes: std::unordered_multimap
No: std::unordered_map
No:
Are elements read then removed in a certain order?
Yes:
Order is:
Ordered by element: std::priority_queue
First in First out: std::queue
First in Last out: std::stack
Other: Custom based on std::vector?????
No:
Should the elements be sorted by value?
Yes: boost::flat_set
No: std::vector