gpt4 book ai didi

c++ - 如何根据另一个 vector 中的条件从 vector 中删除元素?

转载 作者:太空狗 更新时间:2023-10-29 23:49:55 26 4
gpt4 key购买 nike

我有两个等长的 vector ,我想根据其中一个 vector 中的条件从中删除元素。应对两者应用相同的删除操作,以便索引匹配。

我想出了一个使用 std::erase 的解决方案,但它非常慢:

vector<myClass> a = ...;
vector<otherClass> b = ...;
assert(a.size() == b.size());
for(size_t i=0; i<a.size(); i++)
{
if( !a[i].alive() )
{

a.erase(a.begin() + i);
b.erase(b.begin() + i);
i--;
}
}

有没有一种方法可以更有效地做到这一点,最好是使用 STL 算法?

最佳答案

如果顺序无关紧要,您可以将元素交换 到 vector 的后面并将它们弹出。

for(size_t i=0; i<a.size();)
{
if( !a[i].alive() )
{
std::swap(a[i], a.back());
a.pop_back();
std::swap(b[i], b.back());
b.pop_back();
}
else
++i;
}

如果您必须维护顺序,您可以使用 std::remove_if。参见 this answer如何获取删除谓词中取消引用的元素的索引:

a.erase(remove_if(begin(a), end(a),
[b&](const myClass& d) { return b[&d - &*begin(a)].alive(); }),
end(a));

b.erase(remove_if(begin(b), end(b),
[](const otherClass& d) { return d.alive(); }),
end(b));

关于c++ - 如何根据另一个 vector 中的条件从 vector 中删除元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35286786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com