按位置从矢量中删除一些元素

时间:2013-01-24 14:43:27

标签: c++ vector

从向量中删除一组非连续元素(我有其位置)的最快方法是什么?或者获得没有这些元素的新矢量。

例如,我有向量v1 =< 5,9,6,7,12,0,3>。并且我有一个位置向量,我想要消除向量rem =< 0,3,4,6>或者包含真/假的向量,取决于元素是否应该被消除或者不是向量rem =。然后,新矢量将是矢量v2 =< 9,6,0>。

3 个答案:

答案 0 :(得分:2)

如果原始向量中元素的顺序无关紧要,我建议您按递增顺序迭代要删除的索引(这很重要),并为每个元素将其与向量中的最后一个元素交换,而不是致电pop_back

在执行交换之前,您还必须执行检查以查看是否要删除向量的最后一个元素。虽然最后一个元素的索引也属于要删除的元素pop_back,但执行交换和pop_back

编辑:只是为了澄清 - 因为您已经排除了要删除的元素的索引,您可以通过简单地检查最后一个尚未删除的值来检查是否要删除最后一个元素在索引数组中。使用辅助整数索引来跟踪索引是什么,将其初始化为索引数组的大小以删除减1,并在每次删除最后一个元素时将其减1。

答案 1 :(得分:0)

我会一起迭代矢量,有点像合并算法。像这样:

int index1=0, index2=0;

while (index1 < v1.size()) {
    if ( index2 < rem.size() && index1 == rem[index2] ) {
        index2++; // skip this one
    }
    else {
        v2.push_back(v1[index1]); // keep this one
    }

    index1++;
}

使用迭代器会更干净,请注意必须对rem向量进行排序。

编辑:使用索引向量的第三个变量名称进行更正。

答案 2 :(得分:0)

通过最快的速度,我假设代码数量最少,并且还有一些优化:

size_t i = 0;
size_t end = v1.size();
vector<int> vresult;

vresult.reserve(v1.size() - rem.size()); // avoid reallocations

size_t remIt = 0;
for ( ; i != end; ++i )
{
  if ( i != rem[remIt] )
    vresult.push_back(v1[i]); // push our element into the new vector
  else
    remIt++;
}

可能无法编译,上面的代码纯粹是为了算法编写的。