C++ 批准(仅)插入和迭代的std容器

C++ 批准(仅)插入和迭代的std容器,c++,containers,std,C++,Containers,Std,如果我只想插入大量(10.000-100.000)小项目(int、float和double),然后迭代所有项目(顺序不重要),那么使用哪个std容器?(注意:项目数量在开始时未知) 我注意到未排序的_集、list和forward_list有O(1)用于插入,O(n)用于迭代。有没有其他也有这种复杂性?哪一个是最快的?(如果在记忆使用方面存在显著差异,我也会有兴趣了解它们 (我只对std容器感兴趣,而不是Boost或其他库容器)向量可能是一个不错的选择。它与内存消耗中的数组相同。O(1)插入(如果

如果我只想插入大量(10.000-100.000)小项目(int、float和double),然后迭代所有项目(顺序不重要),那么使用哪个std容器?(注意:项目数量在开始时未知)

我注意到未排序的_集、list和forward_list有O(1)用于插入,O(n)用于迭代。有没有其他也有这种复杂性?哪一个是最快的?(如果在记忆使用方面存在显著差异,我也会有兴趣了解它们


(我只对std容器感兴趣,而不是Boost或其他库容器)

向量可能是一个不错的选择。它与内存消耗中的数组相同。O(1)插入(如果在末尾插入)和O(n)迭代。它是最简单的容器,如果删除或随机插入不在您的列表中,它是一个很好的选择。

您问题中的所有类对于您想要的内容都具有最佳的复杂性,但是std::vector可能更快,特别是如果您知道要插入大约多少元素,即您有一个可用的上限


我认为性能可能会因编译器、编译器版本和要插入的元素数而异。很抱歉,没有提供更具体的帮助。

我认为这取决于您希望如何处理容器中的元素

  • 如果要在某些位置插入元素,则列表是最快的,因为数组和向量必须向前一步移动插入位置之后的所有项
  • 另一方面,如果要在某个位置访问项目,则数组和向量的速度更快
此外,除此之外还有容器适配器,如队列、堆栈、优先级队列等


同样,这取决于您的实现以及您希望从元素容器中得到什么。

我的赌注是
std::vector
,并调用
std::vector::reserve()

看一看:定义“很多”,以及它们有多大?答案很可能是
vector
。这在很大程度上取决于您想要保存的元素的数量、类型和访问模式。您应该在现实的运行场景中对其进行分析。
std::vector
可能是最适合的候选。问题已经解决经过编辑以反映项目的大小和数量。在“正常”机器上,答案几乎肯定是
std::vector
。您可以愉快地
。在
vector
上保留(200000)
,并将分配数量减少到一个,而不必强调现代(在最宽松的意义上)例如,向量将有很多在前向列表中不必要的实数。而且它与内存中的数组不同consumption@Trollkemada向量比任何类型的链表都更接近数组的内存消耗量。事实上,它实际上是完全相同的(总共大约有两个指针大)当向量大小正确时。此外,对于100k元素,即使假设您没有预先调整向量大小,也只有大约17个重新分配,其中大多数只复制几十个或几百个项目。在查看所有答案中的所有其他注释后,看起来向量是最好的
std::vector
即使您不这样做,也可能更快t元素的数量没有上限。你只需要测量这些东西。如果我们不知道项目的数量,std::vector将不得不做很多实数运算,对吗?@Trollkemada正确,但实数运算的数量也可能没有那么糟糕。例如,如果你增加(保留)容器大小按指数计算只有几个实数。如果您在容器上多次迭代,这可能会有回报。如果您能够使用std::vector.reserve来防止reallocation@Trollkemada它将不得不做一些事情,但与(比如)遍历一个列表到fi相比,这样做可能会非常快nd一个插入点。迭代的速度会快得多,而且它会有更好的缓存行为。正如我在问题中所说的,顺序并不重要,所以我对在任何位置插入都不感兴趣,只需插入(在任何位置),然后迭代所有元素(以任何顺序)因此,我对访问给定位置的项不感兴趣STD::vector似乎最适合这种情况