[英]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.