当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-16

    本文导语:  erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。如下: 代码如下:list ParticleSystem;list::iterator pointer;if(pointer->dead == true){   pointer = ParticleSystem.erase(pointer);}有一段关于错误使用erase的程序 代码...

erase的作用是,使作为参数的迭代器失效,并返回指向该迭代器下一参数的迭代器。
如下:
代码如下:

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

问题:该程序不能跳出循环
原因:test_list.erase(test_list_it);每次做erase时都有可能使迭代器失效,test_list_it++就发生错误了。可以参见effective 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函数也存在erase函数同样的问题,但remove函数返回值是空,erase返回指向下一个元素的迭代器。

下面是一个简单的例子。
代码如下:

#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
 printf("------------------------------ Startn");
 list 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::iterator i = ls.begin(); i != ls.end(); i++) {
  printf("%d, ", *i);
 }
 printf("n------------------------------n");
 for (list::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::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------------------------------ Endn");
 getchar();
 return 0;
}

其中:
代码如下:

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

也可以写成下面的形式,因为erase函数的返回值就是指向下一个元素的迭代器。
代码如下:

 for (list::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++ Lists(链表) 成员 assign():给list赋值
  • uClinux下如何才能支持标准C++类库,如(string, list)等模板库
  • C++ Lists(链表) 成员 merge():合并两个list
  • C++编写FTP客户端解析LIST命令获取目录不完整,求解。
  • C++ Lists(链表) 成员 splice():合并两个list
  • C++实现的泛型List类分享
  • C++ Lists(链表) 成员 swap():交换两个list
  • c++ STL容器总结之:vertor与list的应用
  • C++ Lists(链表) 成员 remove():从list删除元素
  • C++ Lists(链表) 成员 resize():改变list的大小
  • C++ Lists(链表) 成员 reverse():把list的元素倒转
  • C++ Lists(链表) 成员 get_allocator():返回list的配置器
  • 博客 iis7站长之家
  • C++ Lists(链表) 成员 size():返回list中的元素个数
  • C++ Lists(链表) 成员 rend():指向list末尾的逆向迭代器
  • C++ Lists(链表) 成员 unique():删除list中重复的元素
  • C++ Lists(链表) 成员 max_size():返回list能容纳的最大元素数量
  • C++ Lists(链表) 成员 empty():如果list是空的则返回true
  • C++ Lists(链表) 成员 push_front():在list的头部添加一个元素
  • C++ Lists(链表) 成员 insert():插入一个元素到list中
  • C++ Lists(链表) 成员 push_back():在list的末尾添加一个元素
  • JAVA中list,set,数组之间的转换详解
  • python的dict,set,list,tuple应用详解
  • Python 列表(List)操作方法详解
  • 数组与List之间相互转换的方法详解
  • java list用法示例详解
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c++ STL List查找遍历及各成员函数用法详细介绍
  • 谁能告诉我当调用List.add(String)后是在哪些函数中实现重画的?
  • solaris 下调用Posix共享内存函数 续!fierygnu(va_list) 来领分
  • php函数range/round/list用法实例
  • 大家注意vector, list, set, map成员函数erase
  • java命名空间java.awt类list.accessibleawtlist的类成员方法: list.accessibleawtlist定义及介绍
  • java.awt 和java.util都有List,想调用awt的List而出现Ambiguous class错误怎么办?
  • java命名空间java.awt类list.accessibleawtlist.accessibleawtlistchild的类成员方法: list.accessibleawtlist.accessibleawtlistchild定义及介绍
  • error: expected specifier-qualifier-list before 'list_head
  • java命名空间java.awt类list的类成员方法: list定义及介绍
  • 求 linux/list.h 部分解读list_entry()
  • java命名空间javax.swing.plaf.synth类region的类成员方法: list定义及介绍
  • 使用XmlSerializer序列化List对象成XML格式(list对象序列化)
  • java命名空间javax.accessibility类accessiblerole的类成员方法: list定义及介绍
  • python list使用示例 list中找连续的数字
  • java命名空间javax.swing.plaf.basic类basiclistui的类成员方法: list定义及介绍
  • src/client/sysint/client-state-machine.c:58: add_sm_to_completion_list: Assertion `s_completion_list_index < 256' failed是什么错误啊
  • java命名空间java.util类collections的类成员方法: empty_list定义及介绍
  • 救急:url为product_list.jsp?dpt_code=01+product_type=0101,怎么样能让product_list.jsp接收到的是dpt_code=01&product_type=0101呢?
  • java命名空间javax.accessibility类accessiblerole的类成员方法: list_item定义及介绍
  • frame如何显示List? 50送上!
  • java命名空间java.lang类threadgroup的类成员方法: list定义及介绍
  • Linux 源码 list.h的编译问题
  • java命名空间java.awt类component的类成员方法: list定义及介绍
  • 读linux内核list.h遇到的问题
  • java命名空间java.awt类event的类成员方法: list_select定义及介绍
  • 轻量级快速的List实现 GapList


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3