从矢量中移除一组非连续元素(我有他们的位置)的最快方法是什么?或者得到一个没有这些元素的新矢量。从位置中删除一些元素
例如,我有矢量V1 = < 5,9,6,7,12,0,3>。我有一个位置向量,我想根据元素是否应该被消除或者没有向量rem =来消除向量rem = < 0,3,4,6>或者包含true/false的向量。然后新的矢量将是矢量v2 = < 9,6,0>。
从矢量中移除一组非连续元素(我有他们的位置)的最快方法是什么?或者得到一个没有这些元素的新矢量。从位置中删除一些元素
例如,我有矢量V1 = < 5,9,6,7,12,0,3>。我有一个位置向量,我想根据元素是否应该被消除或者没有向量rem =来消除向量rem = < 0,3,4,6>或者包含true/false的向量。然后新的矢量将是矢量v2 = < 9,6,0>。
如果原始矢量元素的顺序并不重要,我建议你遍历你想增加以去除指数(这很重要),并为每个元素与向量的最后一个元素交换它并致电pop_back
。
您还必须进行检查,看是否向量的最后一个元素进行交换之前被去除。尽管最后一个元素的索引也是要删除的元素之一pop_back
和然后做了交换并且pop_back
。
编辑:只是为了澄清 - 因为你有要删除的元素的索引已经排序,你可以通过检查最后一个值你还没有删除指数数组。使用助手整数索引来跟踪哪个索引是,将其初始化为索引数组的大小以删除负数,并在每次删除最后一个元素时将其减1。
我会一起遍历矢量,有点像合并算法。事情是这样的:
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
矢量必须进行排序。
编辑:通过使用索引向量的第三个变量名称进行更正。
通过最快的,我用的代码最短,也是一个位优化的假设:
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++;
}
可能无法编译,上面的代码是纯粹写给它的算法。
你应该保持原始向量中元素的顺序吗? –
明显的解决方案是迭代要删除的索引向量,然后在v1上调用'erase(iterator)'。 – crush
@IvayloStrandjev不一定是我们可以得到例如V2 = <0,9,6>,但它不应该是随机的......如果我再次应用相同的功能,以V1应该以相同的顺序返回元素在V2 .. – shn