删除向量C ++中的对象

时间:2017-12-15 08:08:38

标签: c++ vector

我有以下问题:

.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中的所有对象。我尝试了很多东西,但没有什么工作正常。

2 个答案:

答案 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有一些内置方法来交叉它们。