我有以下问题:
.onclick
我要做的是删除 vector<CPerson>toRemove;// has some objects that are contained in m_vObjects
vector<CPerson>m_vObjects;
for (auto it = toRemove.begin(); it != toRemove.end(); ++it)
{
for (auto iter = m_vObjects.begin(); iter != m_vObjects.end(); ++iter)
{
iter = m_vObjects.erase(it);
}
}
中包含的m_vObjects
中的所有对象。我尝试了很多东西,但没有什么工作正常。
答案 0 :(得分:2)
您的代码错误:您无法使用一个容器中的迭代器从另一个容器中删除项目。实现所需目标的一种方法是使用std::set_difference
(需要对数组进行排序):
vector<CPerson>toRemove;// has some objects that are contained in m_vObjects
vector<CPerson>m_vObjects;
vector<int> diff;
std::set_difference(
m_vObjects.begin(), m_vObjects.end(),
v2.begin(), v2.end(),
std::inserter(diff, diff.begin()));
m_objects = diff;
如果不希望对数组进行排序,则可以使用std::remove
:
for (const auto& element_to_remove : toRemove) {
std::remove (
m_vObjects.begin (),
m_vObjects.end (),
element_to_remove);
}
答案 1 :(得分:0)
1)你不能在m_vObjects中使用toRemove中的迭代器。它们与每个集合实例紧密相连。
2)在修改集合时对迭代器使用循环并不是一个好习惯:例如,你在当前的interator之后删除了一个对象,但他仍然认为该对象存在。如果我正确,则会导致未定义的行为。
3)修复应该检查迭代器指向的对象的相等性。
if( ( *it == *iter )
{
iter= vObjects.erase( iter );
}
但是,我的解决方案仍然适用于= =人为超载,或者你有另一种检查相等的方法。这对性能非常不利。实际上,恕我直言,对矢量的这种行为总是对性能不利,如果你需要找东西,使用集合或地图会更好。并且set有一些内置方法来交叉它们。