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

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

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

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

有一段關(guān)于錯(cuò)誤使用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時(shí)都有可能使迭代器失效,test_list_it++就發(fā)生錯(cuò)誤了。可以參見effective stl一書。所有容器做erase操作時(shí)都有可能使迭代器失效。
改為:
復(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);
}

這樣仍然是錯(cuò)誤的,原因是:iter_e=test_list_it 是指針值的復(fù)制,它倆其實(shí)指向同一個(gè)位置,所以iter_e失效那么test_list_it也會(huì)失效,所以test_list_it++就會(huì)有問題
如果是
復(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返回指向下一個(gè)元素的迭代器。

下面是一個(gè)簡單的例子。
復(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++);
 }

也可以寫成下面的形式,因?yàn)閑rase函數(shù)的返回值就是指向下一個(gè)元素的迭代器。
復(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++遞歸算法實(shí)例代碼

    C++遞歸算法實(shí)例代碼

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

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

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

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

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

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

    掃雷游戲是在一個(gè)指定的二維空間里,隨機(jī)布置雷,把不是雷的位置都找出來,在你點(diǎn)一個(gè)位置的時(shí)候它會(huì)顯示它周圍全部雷的個(gè)數(shù),根據(jù)這個(gè)線索去找 ,會(huì)更容易贏。本文將用C語言實(shí)現(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,正文有詳細(xì)介紹,歡迎參考
    2018-01-01
  • Qt中QGroupBox控件的實(shí)現(xiàn)

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

琼中| 卓尼县| 钟祥市| 九龙坡区| 黑龙江省| 浙江省| 潜山县| 塔河县| 伊金霍洛旗| 卫辉市| 临沭县| 灌南县| 宣城市| 营山县| 东港市| 临澧县| 合川市| 政和县| 罗城| 沈阳市| 屯门区| 郯城县| 拉萨市| 柳江县| 湖北省| 外汇| 肃南| 平潭县| 高州市| 岳阳市| 哈巴河县| 科技| 上蔡县| 西城区| 磐安县| 贵南县| 东台市| 德兴市| 沙坪坝区| 九龙县| 儋州市|