std::list<>::remove_if的使用
2015-10-21 11:00
399 查看
摘要
std::list<T>::remove_if方法的作用是删除一个链表中所有满足条件的元素,其参数是一个Predicate。然而c++中的Predicate并不是很容易理解,事实上笔者至今仍未能完全掌握它。本文将介绍2种remove_if的简单用法,无需理解Predicate也能使用此功能。开发环境
visual studio 2010,C++方法一:传入回调函数
回调函数的原形为:bool IsRemove(T &obj1);
函数名任意,如果obj1需要被移除则返回1,否则返回0。
使用方法:list.remove_if(IsRemove);
这种方法最简单,但无法向回调函数中传递参数,每一个条件就要有一个回调函数,因此不推荐使用。
方法二(推荐):创建用于比较的类,传入类名及初始化参数
用于比较的类必须重载bool operator( ) ( T &obj1 ) ;方法,如果obj1需要被移除则返回1,否则返回0。用于比较的类还应当包含必要的构造函数,用于传递参数。
使用方法:list.remove_if(classname(args));
例程及运行结果
源码://main.cpp #include "stdio.h" #include "stdlib.h" #include <list> using namespace std; class testclass { public: int m_iVal; int Print(); }; int testclass::Print() { printf("m_iVal=%d,this=%p\n",m_iVal,this); return 0; } bool IsRemove(testclass &obj1) { return obj1.m_iVal==2; } class testclass_remove { public: int m_iKey; bool operator( ) ( testclass &obj1 ) { return obj1.m_iVal==m_iKey; } testclass_remove(int iKey){m_iKey=iKey;}; }; int main(int argc, const char *argv[]) { int iRet=-1,i; int iResult,iTemp; const char *pcTemp; testclass obj1,obj2; list<testclass> objList; list<testclass>::iterator it; obj1.m_iVal=1; obj2.m_iVal=2; //[ objList.insert(objList.end(),obj1); objList.insert(objList.end(),obj1); objList.insert(objList.end(),obj2); objList.insert(objList.end(),obj2); for(it=objList.begin();it!=objList.end();it++) it->Print(); objList.remove_if(IsRemove);//方法一 for(it=objList.begin();it!=objList.end();it++) it->Print(); objList.clear(); //] printf("-------------\n"); //[ objList.insert(objList.end(),obj1); objList.insert(objList.end(),obj1); objList.insert(objList.end(),obj2); objList.insert(objList.end(),obj2); for(it=objList.begin();it!=objList.end();it++) it->Print(); objList.remove_if(testclass_remove(1));//方法二 for(it=objList.begin();it!=objList.end();it++) it->Print(); //] iRet=0; _Exit: ::system("pause"); return iRet; }
运行结果:
m_iVal=1,this=00134A00
m_iVal=1,this=00134A48
m_iVal=2,this=00134A90
m_iVal=2,this=00134AD8
m_iVal=1,this=00134A00
m_iVal=1,this=00134A48
-------------
m_iVal=1,this=00134A00
m_iVal=1,this=00134A48
m_iVal=2,this=00134A90
m_iVal=2,this=00134AD8
m_iVal=2,this=00134A90
m_iVal=2,this=00134AD8
请按任意键继续. . .
----------------------EOB---------------------------------------------
相关文章推荐
- Cucumber java + Webdriver (3) 关于RunCukesTest.java 和 BaiduSearchStepfs.java
- TCP/IP协议学习(一) 协议概述
- gtk events
- android 验证手机号和邮箱格式
- ios精益编程 一个愉快的重构经验
- Android手机使用代理(抓包)
- Linux系统中netstat命令的基本使用方法
- 编译openwrt官方不支持的路由型号固件——以WR720N为例
- 动态MBean:DynamicMBean
- Linux/Unix设计思想(Linux and the Unix Philosophy)
- linux Argument list too long 参数列表过长的办法
- MongoDB基本操作命令
- css3垂直居中
- 问题:https与http有什么区别啊?
- angularjs自定义表单验证
- Java SharedPreferences的使用
- Error filling print... null
- Rotate Image
- android view.getWidth(), view.getHeight() 返回0的问题的解决方案
- iOS 更改项目名称