0

what is the fastest way to remove a set of non-contiguous elements (which I have their positions) from a vector ? Or getting a new vector without these elements.

For example I have vector v1 = <5, 9, 6, 7, 12, 0, 3>. And I have a vector of positions that I want to eliminate vector rem = <0, 3, 4, 6> or a vector containing true/false depending on whether or not the element should be eliminated or not vector rem = . Then the new vector would be vector v2 = <9, 6, 0>.

4

3 回答 3

2

如果原始向量中元素的顺序无关紧要,我建议您以递增的顺序迭代要删除的索引(这很重要),并让每个元素将其与向量中的最后一个元素交换,然后调用pop_back.

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

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

于 2013-01-24T14:49:33.837 回答
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++;
}

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

于 2013-01-24T14:53:08.600 回答
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必须对向量进行排序。

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

于 2013-01-24T14:49:39.363 回答