2013-01-24 82 views
0

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

例如,我有矢量V1 = < 5,9,6,7,12,0,3>。我有一个位置向量,我想根据元素是否应该被消除或者没有向量rem =来消除向量rem = < 0,3,4,6>或者包含true/false的向量。然后新的矢量将是矢量v2 = < 9,6,0>。

+1

你应该保持原始向量中元素的顺序吗? –

+0

明显的解决方案是迭代要删除的索引向量,然后在v1上调用'erase(iterator)'。 – crush

+0

@IvayloStrandjev不一定是我们可以得到例如V2 = <0,9,6>,但它不应该是随机的......如果我再次应用相同的功能,以V1应该以相同的顺序返回元素在V2 .. – shn

回答

2

如果原始矢量元素的顺序并不重要,我建议你遍历你想增加以去除指数(这很重要),并为每个元素与向量的最后一个元素交换它并致电pop_back

您还必须进行检查,看是否向量的最后一个元素进行交换之前被去除。尽管最后一个元素的索引也是要删除的元素之一pop_back然后做了交换并且pop_back

编辑:只是为了澄清 - 因为你有要删除的元素的索引已经排序,你可以通过检查最后一个值你还没有删除指数数组。使用助手整数索引来跟踪哪个索引是,将其初始化为索引数组的大小以删除负数,并在每次删除最后一个元素时将其减1。

+0

你能为此提供一个和平的代码吗? – shn

+3

@shn我可以但是相信如果你自己想出代码会更好。这是处理媒介的一个很好的练习。如果您遇到实施的某个特定部分,我会给您提供指导,但不想为您编写整个事情。 –

+0

你应该注意这个的复杂性...... – JaredC

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矢量必须进行排序。

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

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++; 
} 

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