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