程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 年夜家留意vector, list, set, map成員函數erase

年夜家留意vector, list, set, map成員函數erase

編輯:關於C++

年夜家留意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++

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved