C++ algorithm中find系列函数总结
主要是对find , find_first_of , find_end , find_if , find_if_not这五函数做个总结:
#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool isOld(int a) {
if ((a % 2) == 0)
return true;
else
return false;
}
bool isSmall(int a, int b) {
if (a < b)
return true;
else
return false;
}
bool isEqual(int a, int b) {
if (a == b)
return true;
else
return false;
}
int main() {
vector<int> ivec = { 1,2,3,4,5,1,2,3,4,5 };
vector<int>::iterator iter;
vector<int> jvec = { 3 };
vector<int> kvec = { 3,4 };
iter = find(ivec.begin(), ivec.end(), 5);//1
iter = find_if(ivec.begin(), ivec.end(), isOld);//2
iter = find_if_not(ivec.begin(), ivec.end(), isOld);//3
iter = find_first_of(ivec.begin(), ivec.end(), kvec.begin(), kvec.end());//4
iter = find_first_of(ivec.begin(), ivec.end(), kvec.begin(), kvec.end(), isEqual);//5
iter = find_end(ivec.begin(), ivec.end(), jvec.begin(),jvec.end());//6
iter = find_end(ivec.begin(), ivec.end(), kvec.begin(), kvec.end(), isSmall);//7
}
首先,find函数就是从一个迭代器范围中查找第一个匹配的单个元素,如1,在ivec中查找第一次匹配5的迭代器,返回指向第一个5的迭代器,
详见:http://www.cplusplus.com/reference/algorithm/find/?kw=find
find_if是从头开始,匹配自定义函数,这个函数接受一个参数(来自前面的序列,顺序相同),返回bool值,来自定义一些判断,如2,我添加了一个判断是否为偶数的函数,在ivec中查找第一个为偶数的迭代器,返回指向第一个2的迭代器。
详见:http://www.cplusplus.com/reference/algorithm/find_if/
find_if_not则是从头开始查找第一个不匹配自定义函数,和find_if相反,如3,查找第一个不为偶数的迭代器,返回指向第一个1的迭代器。
详见:http://www.cplusplus.com/reference/algorithm/find_if_not/
find_first_of函数是从一个迭代器范围中查找第一个匹配的迭代器范围,有两种用法,一是直接比较两个迭代器范围是否相等,如4,在ivec中查找kvec,返回指向第一个3的迭代器;还有一种用法是再加一个自定义比较函数,这个函数接受两个参数(两个序列各一个,顺序相同),返回bool值,来自定义一些判断,比如5,加了一个比较是否相等的函数,最后返回的迭代器指向第一个3。
详见:http://www.cplusplus.com/reference/algorithm/find_first_of/
find_end的是从末尾开始查找,也是在一个迭代器范围中查找另外一个迭代器范围,方法也同find_first_of一样有两种,一种是直接匹配,如6;一种是添加自定义比较函数,如7,我添加了一个比小的函数,返回的迭代器指向最后一个2。
详见:http://www.cplusplus.com/reference/algorithm/find_end/
其间区别要细细体会,在不同场景使用,find,find_if,find_if_not都是在一个迭代器范围中查找一个元素,而find_first_of,find_end则是在一个迭代器范围中查找另一个迭代器范围,并且都有添加自定义函数的用法**,不同之处在于一个正序一个逆序查找**。可以粗略的看出,以find -> find_if , find_if_not -> find_first_of ,find_end功能逐步升级。