用find_if查找vector内对象的成员
来源:互联网 发布:js遍历json子节点 编辑:程序博客网 时间:2024/05/08 08:15
用stl的find方法查找一个包含简单类型的vector中的元素是很简单的,例如
vector<string> strVec; find(strVec.begin(),strVec.end(),”aa”);
假如vector包含一个复合类型的对象呢比如
class A{public:A(const std::string str,int id){this->str=str;this->id=id;}private:std::string str;int id;};
这个时候一般的想法是写个函数遍历这个vector,然后进行比较查找。实际上在使用STL的时候,不建议使用循环遍历的查找方法,有几个理由(参加《effictive c++》46条):
- 效率:泛型算法通常比循环高效。
- 正确性: 写循环时比调用泛型算法更容易产生错误。
- 可维护性: 与相应的显式循环相比,泛型算法通常使代码更干净、更直观。
实际上通过find_if泛型算法可以很优雅的达到期望的效果。template<class InputIterator, class Predicate> InputIterator find_if( InputIterator _First, InputIterator _Last, Predicate_Pred );这里的最后一个参数可是一个一元谓词,即只带一个参数且返回值限定为bool的函数对象,例如
bool compare(A& dValue){if(dValue.GetStr().compare(“bb”)==0)return true;elsereturn false;}
示例:
vector<A> a;A b(“aa”,4);A c(“bb”,6);A d(“zz”,7);a.push_back(b);a.push_back(c);a.push_back(d);vector<A>::iterator t=find_if(a.begin(),a.end(),compare);
以上函数限定了比较的内容,如果我们想要灵活的自定义比较条件的话要如何做呢,有2个办法,一个是自定义类
,并重载()操作符号,例如:
class findx{public:findx(const string str){class D{};test=str;}string GetTest(){return test;}bool operator()(A& dValue){if(dValue.GetStr().compare(test)==0)return true;elsereturn false;}private:string test;};
比较的时候只要
vector<A>::iterator t=find_if(a.begin(),a.end(),findx(“33″));
还有一种方法是使用仿函数和绑定器。仿函数就是类似上面的重载了操作符()的自定义类,或者用struct也可以。因为他定义了操作符“()”,所以能够像函数调用一样在对象名后加上“()”,并传入对应的参数,从而执行相应的功能。这样的类型就是函数对象,从而能作为函数参数传递给find_if。
下面再说绑定器:STL中的绑定器有类绑定器和函数绑定器两种,类绑定器有binder1st和binder2nd,而函数绑定器是bind1st和bind2nd,他们的基本目的都是用于构造一个一元的函数对象。比如这里我们可以利用bind2nd通过绑定二元函数对象中的第二个参数的方式来实现二元谓词向一元谓词的转换。
struct compare: binary_function<A, string,bool>{bool operator()( A &value, string str) const{if (value.GetStr()== str)return true;elsereturn false;}};
示例:
vector<A>::iterator t=find_if(a.begin(),a.end(),bind2nd(compare(),”33″));
无论是用vector的循环还是find_if泛型算法,在性能和代码复杂度上面都有一定得权衡,至于在实际应用中,还是需要具体问题具体分析的
- 用find_if查找vector内对象的成员
- 用find_if查找vector内对象的成员
- 用find_if查找vector内对象的成员
- 用find_if查找vector内对象的成员 http://blog.csdn.net/zhongguoren666/article/details/7629610
- find_if和函数对象结合实现对自定义类型vector的查找
- find_if和函数对象结合实现对自定义类型vector的查找
- 使用find_if的自定义条件查找vector或map
- vector的find_if用法
- find_if和函数对象结合实现对自定义类型vector的查找 复杂结构体查询某个值
- vector查找对象或指针成员值的方法
- vector查找结构体实例find_if
- STL 查找vector容器中的指定对象:find()与find_if()算法
- vector中元素的查找(find_if)与复制(copy)
- stl 的find_if算法用来查找容器内的符合条件的元素
- 用find_if查找容器中符合条件的子集
- vector中find和find_if的用法
- STL中vector查找算法find()和find_if()深入比较
- C++ list 自定义的数据结构 find_if查找
- 问题小结(2)-dialog内容动态变化(调用系统方法时)
- 2012年6月2日-午潮山-白龙潭线爬行
- 打印二叉树所有的路径
- Music打开出错
- mysql 常用函数
- 用find_if查找vector内对象的成员
- ROHM BH1710 light sensor调试
- Oracle查看数据库的常用SQL
- linux下排除故障常用命令行
- ruby中method后面?和!的含义
- 算法学习系列-快速排序
- 雷锋融资档案004
- Linux2.6 I/O体系结构
- SDIO SPEC