【发布时间】:2016-12-03 18:43:06
【问题描述】:
我有一个 std::vector [1, 2, 3, 4, 5],我想获得另一个包含除第二个元素之外的所有元素的向量:[1, 3, 4, 5]。一种方法是(vec1 是我的输入向量):
std::vector<int> vec2;
vec2 = vec1;
vec2.erase(vec2.begin()+1)
这里我不太喜欢 O(n) 复杂度的擦除,所以考虑到数组的副本,我将有 2n 次操作。我在想旧的虚拟方式会更好:
std::vector<int> vec2;
for(int i=0; i<vec1.size(); ++i){
if (i != 1)
vec2.push_back(vec1[i]);
}
这是摊销的 O(n) 时间。渐近行为是相同的,但操作的数量可能会更少。
我必须在相当小的向量(大约 100 个元素)上执行此操作,但我有数十亿个。我会注意到显着差异吗?
你会怎么做?
【问题讨论】:
-
先打电话预约。至于您是否会注意到差异,请仔细分析它,这是获得可靠答案的唯一方法。
-
也许你应该重新考虑你的算法,如果没有必要就不要复制。另请查看 insert()
-
您可以向后迭代向量并擦除最后一个元素,因此您不必复制。或者您可以跟踪应该是第一个元素的索引并从它迭代到结束。有很多方法可以避免复制。
标签: c++ algorithm vector data-structures time-complexity