C++ 删除向量C+中的对象+;

C++ 删除向量C+中的对象+;,c++,vector,C++,Vector,我有以下问题: 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(); i

我有以下问题:

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

    }
vectortoRemove;//具有包含在m_vObjects中的某些对象
矢量对象;
对于(自动it=toRemove.begin();it!=toRemove.end();++it)
{
对于(自动iter=m_vObjects.begin();iter!=m_vObjects.end();++iter)
{
iter=m_vObjects.erase(它);
}
}

我要做的是从
m_vObjects
中删除
toRemove
中包含的所有对象。我试过很多东西,但都不管用

您的代码错误:您不能从一个容器中使用迭代器从另一个容器中删除项。实现所需功能的一种方法是使用(需要对数组进行排序):

1) 在m_vObjects中不能使用来自的迭代器来移动。它们与集合的每个实例紧密相连

2) 在修改集合时使用循环迭代器并不是一个好的实践:例如,您在当前interator之后删除了一个对象,但他仍然认为该对象存在。如果我是对的,它会导致未定义的行为

3) 修复方法应该是检查迭代器指向的对象的相等性

  if( ( *it == *iter )
  {
     iter= vObjects.erase( iter );
  }

但是,我的解决方案只有在==对person重载时才有效,或者您有另一个检查相等性的方法。这对性能非常不利。事实上,IMHO,向量处的此类操作对性能总是有害的,如果需要查找某些内容,最好使用set或map。set有一些内置方法与它们相交。

erase(如果需要,请删除(…余数留空作为练习…可能重复您忘记提到的
std::set_difference
对排序范围有效。因此,如果OP使用的向量未排序,您的建议将调用UB。@AlgirdasPreidžius,您是对的,我将修正我的答案。您的“解决方案”调用UB,因为
innerIt
vObjects.erase(innerIt);
call时无效。@AlgirdasPreidžius lol,是的,我解释过它不好,并自己使用过。感谢大家的关注,修复了1)提示:返回“最后删除元素后的迭代器”。.2)如果
m_vObjects
包含多个相同的对象,则更新后的解决方案不会将它们全部删除。@AlgirdasPreidžius我知道多对象的问题,但在您提示之前,我不知道如何处理它。
for (const auto& element_to_remove : toRemove) {
    std::remove (
        m_vObjects.begin (),
        m_vObjects.end (),
        element_to_remove);
}
  if( ( *it == *iter )
  {
     iter= vObjects.erase( iter );
  }