STL 容器使用 erase 遍歷刪除的坑

1. 序列式容器

序列式容器有 vector、deque、list,這里使用 vector 容器來舉例說明
在 C++98 和 C++11 中 vector 的 erase 方法刪除指定迭代器位置都是返回被刪除位置的后一個位置的迭代器。
(vector 和 deque 底層是基于數(shù)組的存儲方式)刪除該迭代器后會導致后面的所有的迭代器失效。
(list 基于鏈表的存儲方式)刪除該迭代器之后導致該迭代器本身失效。

慣用刪除的方法如下:

// 比如刪除 vector<int> vecInt 里面值為0的數(shù)據(jù)
for(vector<int>::iterator it = vecInt.begin(); it != vecInt.end();)
{
    if(*it == 0)
    {
        it = vecInt.erase(it);
    }
    else
    {
        ++it;
    }
}

2. 關聯(lián)式容器

關聯(lián)式容器有 map、multimap、set、multiset,這里使用 map 容器來舉例說明。
對于關聯(lián)容器來說,如果某一個元素已經(jīng)被刪除,那么其對應的迭代器就失效了,不應該再被使用,否則會導致程序無定義的行為。
在 C++98 中 map 的 erase 刪除指定迭代器上的位置沒有返回值

void erase (iterator position);

在 C++98 中慣用刪除的方法如下:

// 比如刪除 map<int,int> mapInt 里面value值為0的數(shù)據(jù)
for(map<int,int>::iterator it = mapInt.begin(); it != mapInt.end();)
{
    if(it->second == 0)
    {
        mapInt.erase(it++);
    }
    else
    {
        ++it;
    }
}

在 C++11 中 map 的 erase 方法刪除指定迭代器位置會返回被刪除位置的后一個位置的迭代器。

iterator  erase (const_iterator position);

在 C++11 中慣用刪除的方法如下:

// 比如刪除 map<int,int> mapInt 里面value值為0的數(shù)據(jù)
for(auto it = mapInt.begin(); it != mapInt.end();)
{
    if(it->second == 0)
    {
        it = mapInt.erase(it);
    }
    else
    {
        ++it;
    }
}
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容