泛型算法find和find_if以及sort
来源:互联网 发布:java 正则ip和端口号 编辑:程序博客网 时间:2024/06/07 03:52
一般的查找方法是写个函数遍历这个vector,一个个进行比较查找。
实际上在使用STL的时候,不建议使用循环遍历的查找方法,建议使用stl的泛型算法。理由如下:(参考《effictive c++》46条)
效率:泛型算法通常比循环高效。
正确性: 写循环时比调用泛型算法更容易产生错误。
可维护性: 与相应的显式循环相比,泛型算法通常使代码更干净、更直观。
1、find模板函数
用stl的find方法查找一个包含简单类型的vector中的元素.
代码如下:
vector<string> strVec; //加入成员。。std::find(strVec.begin(),strVec.end(),"aa");
2、find_if模板函数
假如vector的成员是复合类型的对象时,常使用find_if指定具体的查找方式。
复合类型如:
class A{public:A(const std::string str,int id){__str=str;__id=id;}private:std::string __str;int __id;};
函数声明
template<class InputIterator, class Predicate> InputIterator find_if( InputIterator _First, InputIterator _Last, Predicate_Pred );使用关键:最后一个参数是一个一元谓词
(1)函数
代码如下:
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=std::find_if(a.begin(),a.end(),compare);
不过,函数方式在函数内限定了被比较的内容。
(2)函数对象
带一个参数且返回值限定为bool的函数对象(并重载()操作符号的自定义类)。
代码如下:
class findx{public:findx(const string str){__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=std::find_if(a.begin(),a.end(),findx(“33″));
(3)绑定器
STL中的绑定器有类绑定器和函数绑定器两种,类绑定器有binder1st和binder2nd,而函数绑定器是bind1st和bind2nd,他们的基本目的都是用于构造一个一元的函数对象。
比如这里我们可以利用bind2nd通过绑定二元函数对象中的第二个参数的方式来实现二元谓词向一元谓词的转换。
代码如下:
struct compare: binary_function<A, string,bool>{bool operator()( A &val, string str) const{if (val.GetStr()== str)return true;elsereturn false;}}; vector<A>::iterator t=find_if(a.begin(),a.end(),bind2nd(compare(),”33″));
3、sort模板函数
使用方式也有函数和函数对象方式。
代码如下:
#include <iostream> #include <algorithm> #include <vector> using namespace std; bool myfunction (int i,int j) { return (i<j); } //函数方式struct myclass { bool operator() (int i,int j) { return (i<j);} //函数对象方式} myobject; int main () { int myints[] = {32,71,12,45,26,80,53,33}; vector<int> myvector (myints, myints+8); // 32 71 12 45 26 80 53 33 vector<int>::iterator it; // using default comparison (operator <): sort (myvector.begin(), myvector.begin()+4); //(12 32 45 71)26 80 53 33 // using function as comp sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80) // using object as comp sort (myvector.begin(), myvector.end(), myobject); //(12 26 32 33 45 53 71 80) // print out content: cout << "myvector contains:"; for (it=myvector.begin(); it!=myvector.end(); ++it) cout << " " << *it; cout << endl; return 0; }
0 0
- 泛型算法find和find_if以及sort
- 泛型算法系列6:find()&&find_if()
- STL算法find_if和find
- C++语法基础--泛型算法(generic algorithm)--find(),find_if()
- STL_Algorithm6--find, find_if, sort, binary_search
- stl find和find_if
- C++ find和find_if
- find和find_if
- STL中vector查找算法find()和find_if()深入比较
- STL算法find,find_if,find_if_not,sort,fill,for_each,count,adjacent_find,random_shuffle,prev_permutation
- std里find和find_if
- find,find_if
- vector中find和find_if的用法
- C++的find和find_if函数
- 【C++ STL学习之七】STL算法之find和find_if
- 【C++ STL学习之七】STL算法之find和find_if
- 实战c++中的vector系列--对vector<自定义类>使用std::find 和 std::find_if 算法
- 实战c++中的vector系列--对vector<自定义类>使用std::find 和 std::find_if 算法
- 最常用的git命令
- dllmain简介
- android安卓源码下载
- 读取hadoop Sequence格式的文件的代码
- Kafka Topic动态迁移 (源代码解析)
- 泛型算法find和find_if以及sort
- 一张图告诉你Java命名规范
- [Leetcode]Search for a Range
- android蓝牙开发
- 输出四个数字字符
- AndroidAnnotation在Eclipse环境下部署android 项目
- HTML <meta> 标签
- 项目反思
- 线性代数笔记(向量)