Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ ique ID与它们关联,我希望尽可能简单地从ID中检索个人数据 我想要一个find函数,因此是一个关联容器_C++_C++11_C++ Faq - Fatal编程技术网

C++ ique ID与它们关联,我希望尽可能简单地从ID中检索个人数据 我想要一个find函数,因此是一个关联容器

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.1。我不能不关心订单,因此是一个
无序的容器

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