批准std容器用于(仅)插入和迭代
Appropiate std container for (only) insertion and iteration
如果我只想插入很多(10.000-100.000)小项目(int、float和doubles),然后迭代所有项目(顺序不重要),那么要使用哪个std容器?(注意:项目数量在开始时未知)
我注意到unsorted_set、list和forward_list具有用于插入的O(1)和用于迭代的O(n)。有没有其他东西也有这种复杂性?其中哪一个最快?(如果在内存使用方面有显著差异,我也会有兴趣了解它们。
(我只对std容器感兴趣,对Boost或其他库不感兴趣)
我的赌注是调用std::vector::reserve()
的std::vector
。
向量可能是一个不错的选择。它在内存消耗方面与数组相同。O(1)插入(如果在末尾插入)和O(n)迭代。它是最简单的容器,如果删除或随机插入不在您的列表中,它是一个不错的选择。
问题中的所有类都具有您想要的最佳复杂度,但std::vector可能更快,尤其是,如果您知道要插入大约多少个元素,即您有可用的上限。
我想性能可能会因编译器、编译器版本和要插入的元素数量而异。很抱歉没有提供更具体的帮助。
根据我的说法,这取决于你想对容器中的元素做什么。
- 如果您想在某些位置插入元素,那么列表是最快的,因为数组和向量必须将所有项目移动到插入位置之后,向前移动一步
- 另一方面,如果要访问某个位置的项,则数组和向量会更快
此外,除此之外,还有容器适配器,如队列、堆栈、优先级队列等。
因此,这一切都取决于您的实现以及您想要从元素容器中得到什么。
相关文章:
- 列表的有效性在插入后开始迭代器
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++ 向量插入和迭代器混淆
- 在插入容器之前转换输出迭代器
- 如何将元素插入和迭代到这种映射.C++
- 插入 boost::multi_index 后迭代器变得无效?
- unordered_set范围插入与迭代器
- 如果迭代器没有因插入而无效,则使用std::find和C::insert()是线程安全的
- 使用条件迭代器插入到向量中
- 向量<pointer>:插入(迭代器,指针)插入垃圾值
- 并行STL插入迭代器,例如std :: back_insert_iterator
- unordered_map在结束迭代器上插入
- 重新插入元素可以"re-validate"迭代器吗?
- C 无法在列表上的迭代后使用插入物来附加值
- 在 std::vector 中插入迭代器范围
- 如何普遍有效地填充缓冲液?(传递插入迭代器?器皿?等)
- 在范围 (C++) 之外列出插入迭代器
- 插入迭代器与容器的成员函数插入器
- C++列表在范围外插入迭代器
- 映射插入迭代器绑定