欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于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ò)誤了??梢詤⒁奺ffective 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è)簡(jiǎn)單的例子。
復(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)文章

  • 數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解

    數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法中二叉樹子結(jié)構(gòu)的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++類的靜態(tài)成員初始化詳細(xì)講解

    C++類的靜態(tài)成員初始化詳細(xì)講解

    通常靜態(tài)數(shù)據(jù)成員在類聲明中聲明,在包含類方法的文件中初始化.初始化時(shí)使用作用域操作符來指出靜態(tài)成員所屬的類.但如果靜態(tài)成員是整型或是枚舉型const,則可以在類聲明中初始化
    2013-09-09
  • C語言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇游戲

    C語言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • strncpy與snprintf 的用法比較

    strncpy與snprintf 的用法比較

    以下是對(duì)strncpy與snprintf的具體用法以及區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07
  • C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例

    C基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)硪黄狢基礎(chǔ) mariadb處理的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • C++ 整型與字符串的互轉(zhuǎn)方式

    C++ 整型與字符串的互轉(zhuǎn)方式

    今天小編就為大家分享一篇C++ 整型與字符串的互轉(zhuǎn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言單雙線性及循環(huán)鏈表與實(shí)例

    C語言單雙線性及循環(huán)鏈表與實(shí)例

    這篇文章主要介紹了C語言的單鏈表、雙鏈表和循環(huán)鏈表,還有一些相關(guān)的實(shí)例,感興趣的同學(xué)可以借鑒一下
    2023-03-03
  • C++如何將十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串

    C++如何將十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串

    這篇文章主要介紹了C++如何將十六進(jìn)制字符串轉(zhuǎn)換為二進(jìn)制字符串問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • c語言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語言實(shí)現(xiàn)冒泡排序、希爾排序等多種算法示例

    c語言實(shí)現(xiàn)插入排序、冒泡排序、選擇排序、快速排序、堆排序、歸并排序、希爾排序示例,需要的朋友可以參考下
    2014-04-04
  • 在C++中使用HP-Socket

    在C++中使用HP-Socket

    這篇文章主要介紹了C++中簡(jiǎn)單使用HP-Socket,HP-Socket 是一套通用的高性能 TCP/UDP /HTTP 通信 框架 ,包含服務(wù)端組件、客戶端組件和 Agent 組件,廣泛適用于各種不同應(yīng)用場(chǎng)景的 TCP/UDP /HTTP 通信系統(tǒng),下面來看看更具體的介紹吧
    2021-11-11

最新評(píng)論