簡體   English   中英

在向量C ++中刪除對象

[英]Deleting objects in vector C++

我有以下問題:

    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中包含的toRemove刪除所有對象。 我嘗試了很多東西,但是沒有任何效果。

您的代碼是錯誤的:您不能使用一個容器中的迭代器從另一個容器中刪除項目。 實現所需目標的一種方法是使用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)您不能在m_vObjects中使用toTomove中的迭代器。 它們與集合的每個實例緊密相連。

2)在修改集合時在迭代器上使用循環並不是一個好習慣:例如,您在當前插入器之后刪除了一個對象,但他仍然認為該對象在那里。 如果我是正確的,它會導致未定義的行為。

3)解決方法是檢查由迭代器指向的對象是否相等。

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

但仍然,我的解決方案僅在==對人員超載時有效,或者您有另一種檢查相等性的方法。 這對性能非常不利。 恕我直言,實際上,矢量處的此類操作始終不利於性能,如果需要查找內容,則最好使用set或map。 並且set具有一些內置方法來相交。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM