最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于C++ list中erase與remove函數(shù)的使用詳解

 更新時間:2013年05月27日 16:53:44   作者:  
本篇文章是對C++ list中erase與remove函數(shù)的使用進行了詳細的分析介紹,需要的朋友參考下
erase的作用是,使作為參數(shù)的迭代器失效,并返回指向該迭代器下一參數(shù)的迭代器。
如下:
復(fù)制代碼 代碼如下:

list ParticleSystem;
list::iterator pointer;
if(pointer->dead == true)
{
   pointer = ParticleSystem.erase(pointer);
}

有一段關(guān)于錯誤使用erase的程序
復(fù)制代碼 代碼如下:

using namespace std;
int main()
{
  std::listtest_list;
  std::list::iterator test_list_it;
  test_list.push_back(1);
  test_list_it = test_list.begin();
  for(;test_list_it != test_list.end();test_list_it++)
  {
  test_list.erase(test_list_it);
  }
}

問題:該程序不能跳出循環(huán)
原因:test_list.erase(test_list_it);每次做erase時都有可能使迭代器失效,test_list_it++就發(fā)生錯誤了??梢詤⒁奺ffective stl一書。所有容器做erase操作時都有可能使迭代器失效。
改為:
復(fù)制代碼 代碼如下:

for(;test_list_it != test_list.end();)
{
    test_list.erase(test_list_it++);
}

or
復(fù)制代碼 代碼如下:

for(;test_list_it != test_list.end();)
{
    std::list::iterator iter_e=test_list_it++;
    test_list.erase(iter_e);
}

注意:
復(fù)制代碼 代碼如下:

for(;test_list_it != test_list.end();test_list_it++;) {
    std::list::iterator iter_e=test_list_it;
    test_list.erase(iter_e);
}

這樣仍然是錯誤的,原因是:iter_e=test_list_it 是指針值的復(fù)制,它倆其實指向同一個位置,所以iter_e失效那么test_list_it也會失效,所以test_list_it++就會有問題
如果是
復(fù)制代碼 代碼如下:

for(;test_list_it != test_list.end();)
{
    std::list::iterator iter_e=test_list_it++;
    test_list.erase(iter_e);
}

則沒有問題。
remove函數(shù)也存在erase函數(shù)同樣的問題,但remove函數(shù)返回值是空,erase返回指向下一個元素的迭代器。

下面是一個簡單的例子。
復(fù)制代碼 代碼如下:

#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <list>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 printf("------------------------------ Start\n");
 list<int> ls;
 printf("ls.empty() = %d \n", ls.empty());
 printf("ls.max_size() = %d \n", ls.max_size());
 printf("ls.size() = %d \n", ls.size());
 ls.push_back(1);
 ls.push_back(2);
 ls.push_back(3);
 printf("\n--------- after push 1, 2, 3 ---------\n");
 printf("ls.empty() = %d \n", ls.empty());
 printf("ls.max_size() = %d \n", ls.max_size());
 printf("ls.size() = %d \n", ls.size());
 for (list<int>::iterator i = ls.begin(); i != ls.end(); i++) {
  printf("%d, ", *i);
 }
 printf("\n------------------------------\n");
 for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
  printf("erase %d \n", *i);
  ls.erase(i++);
 }
 printf("\n--------- after erase ---------\n");
 printf("ls.empty() = %d \n", ls.empty());
 printf("ls.max_size() = %d \n", ls.max_size());
 printf("ls.size() = %d \n", ls.size());
 printf("\n------------------------------\n");
 ls.push_back(1);
 ls.push_back(2);
 ls.push_back(3);
 for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
  printf("remove %d \n", *i);
  ls.remove(*i++);
 }
 printf("\n--------- after remove ---------\n");
 printf("ls.empty() = %d \n", ls.empty());
 printf("ls.max_size() = %d \n", ls.max_size());
 printf("ls.size() = %d \n", ls.size());
 printf("\n------------------------------ End\n");
 getchar();
 return 0;
}

其中:
復(fù)制代碼 代碼如下:

 for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
  printf("erase %d \n", *i);
  ls.erase(i++);
 }

也可以寫成下面的形式,因為erase函數(shù)的返回值就是指向下一個元素的迭代器。
復(fù)制代碼 代碼如下:

 for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {
  printf("erase %d \n", *i);
  i = ls.erase(i);
 }

輸出結(jié)果如下:
------------------------------ Start
ls.empty() = 1
ls.max_size() = 1073741823
ls.size() = 0
--------- after push 1, 2, 3 ---------
ls.empty() = 0
ls.max_size() = 1073741823
ls.size() = 3
1, 2, 3,
------------------------------
erase 1
erase 2
erase 3
--------- after erase ---------
ls.empty() = 1
ls.max_size() = 1073741823
ls.size() = 0
------------------------------
remove 1
remove 2
remove 3
--------- after remove ---------
ls.empty() = 1
ls.max_size() = 1073741823
ls.size() = 0
------------------------------ End

相關(guān)文章

  • C++遞歸算法實例代碼

    C++遞歸算法實例代碼

    這篇文章主要介紹了C++遞歸算法實例代碼,還是比較不錯的,運用了遞歸算法解決相關(guān)問題,這里分享給大家,需要的朋友可以參考下。
    2017-11-11
  • C語言構(gòu)建連連看游戲(矩陣方式)

    C語言構(gòu)建連連看游戲(矩陣方式)

    這篇文章主要為大家詳細介紹了C語言構(gòu)建連連看游戲,采用矩陣方式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言的fork函數(shù)在Linux中的進程操作及相關(guān)面試題講解

    C語言的fork函數(shù)在Linux中的進程操作及相關(guān)面試題講解

    fork函數(shù)只能在類Unix的系統(tǒng)中使用,用于創(chuàng)建子線程,這里總結(jié)了C語言的fork函數(shù)在Linux中的進程操作及相關(guān)面試題講解,先來看一下C語言程序的存儲空間與進程示意:
    2016-06-06
  • C語言實現(xiàn)經(jīng)典掃雷小游戲的示例代碼

    C語言實現(xiàn)經(jīng)典掃雷小游戲的示例代碼

    掃雷游戲是在一個指定的二維空間里,隨機布置雷,把不是雷的位置都找出來,在你點一個位置的時候它會顯示它周圍全部雷的個數(shù),根據(jù)這個線索去找 ,會更容易贏。本文將用C語言實現(xiàn)這一經(jīng)典游戲,感興趣的可以嘗試一下
    2022-11-11
  • C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解

    C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解

    這篇文章主要介紹了C和C++中的基本數(shù)據(jù)類型的大小及表示范圍詳解,基本數(shù)據(jù)類型有int、long、long long、float、double、char、string,正文有詳細介紹,歡迎參考
    2018-01-01
  • Qt中QGroupBox控件的實現(xiàn)

    Qt中QGroupBox控件的實現(xiàn)

    QGroupBox 是 Qt 框架中一個非常有用的控件,它主要用于組織和管理一組相關(guān)的控件,本文主要介紹了Qt中QGroupBox控件的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-04-04
  • VC動態(tài)生成菜單項的實現(xiàn)方法

    VC動態(tài)生成菜單項的實現(xiàn)方法

    這篇文章主要介紹了VC動態(tài)生成菜單項的實現(xiàn)方法,在桌面應(yīng)用程序開發(fā)中常會用到的一個功能,需要的朋友可以參考下
    2014-08-08
  • C語言實現(xiàn)排雷游戲(多文件)

    C語言實現(xiàn)排雷游戲(多文件)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)排雷游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實現(xiàn)貪吃蛇游戲代碼

    C語言實現(xiàn)貪吃蛇游戲代碼

    大家好,本篇文章主要講的是C語言實現(xiàn)貪吃蛇游戲代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • 希爾排序算法的C語言實現(xiàn)示例

    希爾排序算法的C語言實現(xiàn)示例

    這篇文章主要介紹了希爾排序算法的C語言實現(xiàn)示例,希爾排序可以看作為一種高級的插入排序,需要的朋友可以參考下
    2016-04-04

最新評論

宣恩县| 富蕴县| 丰都县| 大关县| 辉南县| 多伦县| 马鞍山市| 南平市| 垦利县| 北安市| 什邡市| 全椒县| 吉林省| 岐山县| 固安县| 蓝田县| 咸丰县| 宽城| 隆子县| 兴国县| 秦皇岛市| 日喀则市| 土默特右旗| 甘洛县| 牡丹江市| 祁阳县| 定西市| 桂林市| 云林县| 上杭县| 阿勒泰市| 阿图什市| 连平县| 潼关县| 诸暨市| 梁平县| 旬邑县| 仁化县| 安丘市| 长汀县| 家居|