源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

基于C++ list中erase与remove函数的使用详解

  • 时间:2022-12-02 10:36 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:基于C++ list中erase与remove函数的使用详解
[b]erase[/b]的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。 如下:
[u]复制代码[/u] 代码如下:
list ParticleSystem; list::iterator pointer; if(pointer->dead == true) {    pointer = ParticleSystem.erase(pointer); }
有一段关于错误使用erase的程序
[u]复制代码[/u] 代码如下:
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);   } }
[b]问题:[/b]该程序不能跳出循环 [b]原因:[/b]test_list.erase(test_list_it);每次做erase时都有可能使迭代器失效,test_list_it++就发生错误了。可以参见effective stl一书。所有容器做erase操作时都有可能使迭代器失效。 [b]改为: [/b]
[u]复制代码[/u] 代码如下:
for(;test_list_it != test_list.end();) {     test_list.erase(test_list_it++); }
or
[u]复制代码[/u] 代码如下:
for(;test_list_it != test_list.end();) {     std::list::iterator iter_e=test_list_it++;     test_list.erase(iter_e); }
[b]注意: [/b]
[u]复制代码[/u] 代码如下:
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++就会有问题 如果是
[u]复制代码[/u] 代码如下:
for(;test_list_it != test_list.end();) {     std::list::iterator iter_e=test_list_it++;     test_list.erase(iter_e); }
则没有问题。 remove函数也存在erase函数同样的问题,但remove函数返回值是空,erase返回指向下一个元素的迭代器。 下面是一个简单的例子。
[u]复制代码[/u] 代码如下:
#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; }
其中:
[u]复制代码[/u] 代码如下:
 for (list<int>::iterator i = ls.begin(); i != ls.end(); ) {   printf("erase %d \n", *i);   ls.erase(i++);  }
也可以写成下面的形式,因为erase函数的返回值就是指向下一个元素的迭代器。
[u]复制代码[/u] 代码如下:
 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
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部