【问题标题】:Which STL container best meets these needs?哪个 STL 容器最能满足这些需求?
【发布时间】:2018-03-04 16:33:22
【问题描述】:

我想要一些关于哪种 STL 容器最能满足以下需求的建议:

  1. 该集合的寿命相对较短。
  2. 集合包含指针。
  3. 仅在末尾添加元素。必须保持元素的顺序。
  4. 元素的数量未知,可能从数亿到数百万不等。只有在添加最后一个元素后才能知道该数字。
  5. 我可能会多次迭代元素。
  6. 添加完所有元素后,我需要根据指针所指的对象对集合进行排序。
  7. 排序后,我可能会多次迭代元素。
  8. 之后,集合将被销毁。

不需要线程安全。

以下是我的想法:
list:需要为每个元素单独分配。更昂贵的遍历。
向量:随着集合的增长需要重新分配。最佳排序和遍历性能。
双端队列:分配比列表少,重新分配比向量少。我不知道关于排序的行为。

我目前正在使用列表。 In which scenario do I use a particular STL container? 的流程图将我引导至双端队列。

我对 STL 的了解已经很老了;我不知道自 2003 年以来添加的容器类型,所以也许有一些我从未听说过的非常适合的东西。

【问题讨论】:

  • 几乎总是vector。无论如何,如果您真的关心性能,请测量它。如果你不衡量,你就真的不在乎。
  • 按照流程图,我会使用矢量 - 无论如何,这几乎总是一个明智的默认选择,除非您有其他证据。 “大小变化很大”是指需要定期增加和减少大小,而不是大小可能会稳步变大。
  • 啊,@Peter,谢谢,我误解了。
  • 是的,@Igor,我当然打算测量它,但我想确保我从正确的选择开始。

标签: c++ stl


【解决方案1】:

std::vector<T*> 将根据所讨论的分数获胜。

不要害怕需要调整大小 - 只需 reserve() 一个合理的数量(如果您的许多收藏都在那里,则说 500)。

使用vector<T*> 的排序性能也会非常好。

每个T 的分配和释放将很重要。注意这一点。例如,您可能希望一次分配数千个Ts,以减少内存分配开销(并使其在最后释放所有内容的速度更快)。这被称为“竞技场”或“游泳池”。你大概可以将 32 位的相对指针存储到 arena 中,节省一半的指针存储空间。

当然,如果T 很小,您可以考虑按值而不是指针来存储它。

【讨论】:

    猜你喜欢
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    相关资源
    最近更新 更多