我有两个相等长度的向量,我想根据其中一个向量中的条件从中删除元素.应对两者应用相同的删除操作,以使索引匹配.
我提出了一个使用的解决方案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--;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法可以更有效地执行此操作,最好使用stl算法?
如果顺序无关紧要,你可以swap将元素放在向量的背面并弹出它们.
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;
}
Run Code Online (Sandbox Code Playgroud)
如果您必须维护您可以使用的订单std::remove_if.请参阅此答案如何获取remove谓词中的dereferenced元素的索引:
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));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1137 次 |
| 最近记录: |