年夜家留意vector, list, set, map成員函數erase。本站提示廣大學習愛好者:(年夜家留意vector, list, set, map成員函數erase)文章只能為提供參考,不一定能成為您想要的結果。以下是年夜家留意vector, list, set, map成員函數erase正文
#include <iostream>
#include <vector>
#include <list>
#include <iterator>
using namespace std;
void Remove1(vector<int> &vec, int num)
{
vector<int>::iterator iter;
for (iter=vec.begin(); iter!=vec.end(); ++iter)
{
if (*iter == num)
{
vec.erase(iter);
}
}
}
void Remove2(list<int> &lst, int num)
{
list<int>::iterator iter;
for (iter=lst.begin(); iter!=lst.end(); ++iter)
{
if (*iter == num)
{
lst.erase(iter);
}
}
}
int main(void)
{
int arr[] = {1, 3, 5, 5, 7, 9};
int num = sizeof(arr) / sizeof(arr[0]);
vector<int> vec(arr, arr+num);
list<int> lst(arr, arr+num);
Remove1(vec, 5);
copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
//Remove2(lst, 5);
//copy(lst.begin(), lst.end(), ostream_iterator<int>(cout, " "));
return 0;
}
請看下面的Remove1、Remove2這兩個函數是刪除容器中一切為num的元素,乍一看似乎沒甚麼成績,實際上是錯的。
它們編譯都沒甚麼成績,然則運轉有成績:
先正文Remove2這兩行, 編譯運轉, 獲得成果是:1 3 5 7 9
明顯成果是毛病的,由於還有個5沒刪失落。形成如許成果的緣由是vec.erase以後iter會自加,履行下次for輪回時++iter,如許就跳過了與所刪除元素相鄰的元素了。
再來看下Remove2, 正文失落Remove1, 刪除Remove2的正文。
運轉失足,vs2005 Expression:list iterator not incrementable,解釋list迭代器++iter有成績。
list是一個雙向鏈表,在erase(iter)以後iter掉效了,printf("0x%x", iter);獲得成果為0,只要erase的前往值能力指向下一個元素。
Remove1的准確用法是:vec.erase(remove(vec.begin(), vec.end(), 5), vec.end());
Remove2的准確用法是:lst.remove(5);
上面是另外一種准確寫法:
void Remove1(std::vector<int> &vec, int num)
{
std::vector<int>::iterator iter = vec.begin();
while (iter != vec.end())
{
if (*iter == num)
{
iter = vec.erase(iter);
}
else
{
++iter;
}
}
}
// 刪除某一類元素, 好比:偶數
void Remove3(std::set<int>& sets)
{
std::set<int>::iterator iter = sets.begin();
while (iter != sets.end())
{
if (0 == (*iter)%2)
{
// 留意這裡不克不及寫成++iter,前面解釋緣由
sets.erase(iter++);
}
else
{
++iter;
}
}
}
void Remove4(std::map<int, int>& maps)
{
std::map<int, int>::iterator iter = maps.begin();
while (iter != maps.end())
{
if (0 == (iter->first)%2)
{
maps.erase(iter++);
}
else
{
++iter;
}
}
}
set和map是由紅黑樹來完成的,當erase的時刻迭代器就掉效了,也就是說我們要在迭代器掉效之前保存一個正本,依據這個正本我們能力持續遍歷下一個元素。i++和++i很顯著前者相符我們的請求所以在erase外面是iter++