雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當前位置:主頁 > 軟件編程 > C語言 >

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

來源:本站原創(chuàng)|時間:2020-01-10|欄目:C語言|點擊:

erase的作用是,使作為參數(shù)的迭代器失效,并返回指向該迭代器下一參數(shù)的迭代器。
如下:

復制代碼 代碼如下:

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

有一段關于錯誤使用erase的程序
復制代碼 代碼如下:

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操作時都有可能使迭代器失效。
改為:
復制代碼 代碼如下:

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

or
復制代碼 代碼如下:

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

注意:
復制代碼 代碼如下:

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 是指針值的復制,它倆其實指向同一個位置,所以iter_e失效那么test_list_it也會失效,所以test_list_it++就會有問題
如果是
復制代碼 代碼如下:

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返回指向下一個元素的迭代器。

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

#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;
}

其中:
復制代碼 代碼如下:

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

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

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

輸出結果如下:
------------------------------ 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

上一篇:基于C++輸出指針自增(++)運算的示例分析

欄    目:C語言

下一篇:基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討

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

本文地址:http://m.jygsgssxh.com/a1/Cyuyan/4474.html

網(wǎng)頁制作CMS教程網(wǎng)絡編程軟件編程腳本語言數(shù)據(jù)庫服務器

如果侵犯了您的權利,請與我們聯(lián)系,我們將在24小時內(nèi)進行處理、任何非本站因素導致的法律后果,本站均不負任何責任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權所有