【问题标题】:Whats the most efficient way to remove the first element from a large vector?从大向量中删除第一个元素的最有效方法是什么?
【发布时间】:2016-02-11 23:51:03
【问题描述】:

假设我有一个包含 100000 个元素的向量,我希望逐个迭代该向量,同时将元素复制到某种映射中,但在每次迭代期间,从向量中删除元素 - 什么是最有效的方法是什么?

在遍历向量时,我做了类似“it = vec.erase(it)”之类的操作,但它需要很长时间才能完成。没有更快的方法吗?顺便说一句,订购非常重要......

【问题讨论】:

  • 你要删除向量中的每个元素吗?最后不能直接打clear()吗?
  • 不要使用矢量。使用不同的容器。
  • 将元素放入一个自己排序的容器中时,排序有多重要?
  • 嗯,如果你使用 push_back @BaummitAugen,vector 会阻止你放置元素的顺序,但这听起来绝对像是队列或链表的工作..
  • @Anedar 但地图通常不会。

标签: c++ vector


【解决方案1】:

没有。您正在使用向量作为队列。这违背了它的设计。

你有几个选择。立即想到以下内容:

  • 不要一次删除一项。分批做。

  • 将向量用作环形缓冲区并仅推进一个索引,但从不删除元素。

  • 使用更合适的容器,例如std::deque

【讨论】:

    【解决方案2】:

    由于向量中元素的顺序可能并不重要 - 无论如何您都将它们放在地图中 - 简单的解决方案是将第一个元素与最后一个元素交换,然后删除最后一个元素。这样会快很多。

    【讨论】:

    • 如果你打算这样做,你还不如避免交换,只是反向处理向量,每次都弹出。
    【解决方案3】:

    如果您需要使用vector,那么根据您的要求,您应该使用指向动态分配的对象实例的指针vector,而不是使用对象本身的vector

    【讨论】:

    • 不,没有混淆。我的想法是基于他们可能希望坚持使用vector。在这种情况下,vector<SomeMaybeBigElement> 在删除元素时的表现会比 'vector` 差很多。没有更多关于他们真正想要做什么的细节,我只关注vector 的使用。
    猜你喜欢
    • 2011-04-09
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2011-04-06
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多