什么是从大向量中删除第一个元素的最有效方法?

5

假设我有一个包含100000个元素的向量,我想逐个迭代这个向量,并将元素复制到某种映射中,但在每次迭代过程中,从向量中删除该元素 - 有没有更有效的方法来做到这一点?

在迭代向量时,我尝试使用"it = vec.erase(it)"的方式,但它需要很长时间才能完成。是否有更快的方法?顺便说一下,顺序非常重要...


7
你打算把向量中的每个元素都删除吗?你不能只是在最后调用clear()吗? - Benjamin Lindley
1
请使用不同的容器,而非向量。 - VladimirS
把元素放入一个自己进行排序的容器中时,顺序有多重要? - Baum mit Augen
嗯,如果你使用push_back,vector会防止你放置元素的顺序@BaummitAugen,但这绝对是队列或链表的工作。 - Anedar
@Anedar 但是通常情况下,一个映射表并不会这样。 - Baum mit Augen
3个回答

5

这个问题不存在一个简单的解决方案。你正在将vector用作队列,这与它的设计初衷不符。

你有几种选择。以下是我能立即想到的:

  • 不要逐个删除元素,批量删除。

  • 将vector用作环形缓冲区,只需移动索引,但永远不要删除元素。

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


0

由于向量中元素的顺序并不重要 - 无论如何都会将它们放入映射中 - 简单的解决方案是交换第一个元素和最后一个元素,然后删除最后一个元素。这样会更快。


3
如果你想这样做,那么最好避免交换并且反向处理向量,每次弹出一个。 - rici

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

没有混淆。我的想法基于他们可能希望坚持使用vector。在这种情况下,当涉及到删除元素时,vector<SomeMaybeBigElement>的性能会比vector<SomeMaybeBigElement *>差很多。由于缺乏更多关于他们真正想做什么的细节,我只关注了vector的使用。 - Jim Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接