C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用

一.find运算

假设有一个int型的vector对象,名为vec,我们想知道其中是否包含某个特定值

解决这个问题最简单的方法时使用标准库提供的find运算:

 1 // value we‘ll look for
 2 int search_value = 42;
 3
 4 //call find to see if that value is present
 5 vector<int>::const_iterator result = find(vec.begin() , vec.end() , search_value);
 6
 7 //report the result
 8 cout<<"The value "<<search_value
 9 <<(result == vec.end() ? " is not present" : "is present")
10 <<endl;

具体实现代码:

 1 #include<iostream>
 2 #include<vector>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 int main()
 7 {
 8 // value we‘ll look for
 9    int search_value = 42;
10    int ival;
11    vector<int> vec;
12
13    while(cin>>ival)
14       vec.push_back(ival);
15
16    cin.clear();
17
18 //call find to see if that value is present
19    vector<int>::const_iterator result = find(vec.begin() , vec.end() , search_value);
20
21 //report the result
22   cout<<"The value "<<search_value
23       <<(result == vec.end() ? " is not present" : "is present")
24       <<endl;
25
26   return 0;
27 }

接下来再举一个例子:

 1 #include <algorithm>
 2 #include <list>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 int main()
 8 {
 9     list<int> ilist;
10     for (size_t i = 0; i < 10; ++i)
11     {
12         ilist.push_back(i+1);
13     }
14
15     ilist.push_back(10);
16
17     list<int>::iterator iLocation = find(ilist.begin(), ilist.end(), 10);   //find操作查找等于10的元素,并返回指向该元素的迭代器,如果没有找到,返回指向集合最后一个元素的迭代器
18
19     if (iLocation != ilist.end())
20     {
21         cout << "找到元素 10" << endl;
22     }
23
24     cout << "前一个元素为:" << *(--iLocation) << endl;
25
26     return 0;
27 }  

类似地,由于指针的行为与作用在内置数组上的迭代器一样,因此也可以使用find来搜索数组:

1 int ia[6] = {27 , 210 , 12 , 47 , 109 , 83};
2 int search_value = 83;
3 int *result = find(ia , ia + 6 , search_value);
4 cout<<"The value "<<search_value
5     <<(result == ia + 6 ? " is not present" : "is present")
6     <<endl;

如果需要传递一个子区间,则传递指向这个子区间的第一个元素以及最后一个元素的下一位置的迭代器(或指针)。

例如,在下面对find函数的调用中,只搜索了ia[1]和ia[2]:

//only search elements ia[1] and ia[2]
int *result = find(ia + 1 , ia + 3 , search_value);

二.find_first_of的使用

除了find之外,标准库还定义了其他一些更复杂的查找算法。当中的一部分类似string类的find操作,其中一个是find_first_of函数。

这个算法带有两对迭代器参数来标记两端元素范围:第一段范围内查找与第二段范围中任意元素匹配的元素,然后返回一个迭代器,指向第一个匹配的元素。如果找不到匹配元素,则返回第一个范围的end迭代器。

假设roster1和roster2是两个存放名字的list对象,可使用find_first_of统计有多少个名字同时出现在这两个列表中

 1 size_t cnt = 0;
 2 list<string>::iterator it = roster1.begin();
 3
 4 // look in roster1 for any name also in roster2
 5 while((it = find_first_of(it , roster1.end() , roster2.begin() , roster2.end())) != roster1.end())
 6 {
 7     ++cnt;
 8     // we got a match , increment it to look in the rest of roster1
 9     ++it;
10 }
11 cout<<"Found "<<cnt
12     <<"  names on both rosters "<<endl;

调 用find_first_of查找roster2中的每个元素是否与第一个范围内的元素匹配,也就是在it到roster1.end()范围内查找一个元 素。该函数返回此范围内第一个同时存在于第二个范围中的元素。在while的第一次循环中,遍历整个roster1范围。第二次以及后续的循环迭代则只考 虑roster1中尚未匹配的部分。

循环条件检查find_first_of的返回值,判断是否找到匹配的名字。如果找到一个匹配,则使计 数器加1,同时给it加1,使它指向roster1中的下一个元素。很明显可知,当不再有任何匹配时,find_first_of返回 roster1.end(),完成统计。

find_first_of,带有两对迭代器参数。每对迭代器中,两个参数的类型必须精确匹配,但不要求两对之间的类型匹配。特别是,元素可存储在不同类型的序列中,只要这两个序列的元素可以比较即可。

在 上述程序中,roster1和roster2的类型不必精确匹配:roster1可以使list对象,而roster2则可以使vector对象、 deque对象或者是其他后面要学到的序列。只要这两个序列的的元素可使用相等(==)操作符进行比较即可。如果roster1是list< string>对象,则roster2可以使vector<char*>对象,因为string标准库为string对象与char* 对象定义了相等(==)操作符。

三.find_if的使用

find_if算法 是find的一个谓词判断版本,它利用返回布尔值的谓词判断pred,检查迭代器区间[first, last)上的每一个元素,如果迭代器iter满足pred(*iter) == true,表示找到元素并返回迭代器值iter;未找到元素,则返回last。

find_if :在序列中找符合某谓词的第一个元素。

函数原型为:

1     template<class InputIterator, class Predicate>
2        InputIterator find_if(
3           InputIterator _First,
4           InputIterator _Last,
5           Predicate _Pred
6        );  

举个例子说明如下:

 1 #include <algorithm>
 2 #include <vector>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 //谓词判断函数 divbyfive : 判断x是否能5整除
 8 bool divbyfive(int x)
 9 {
10     return x % 5 ? 0 : 1;
11 }
12
13 int main()
14 {
15   /*
16     //初始vector : 方式一
17     //使用下标方式来操作vector
18     //vector随机访问方便,但插入、删除操作效率非常低
19     vector<int> iVect(20);
20
21     for(size_t i = 0; i < iVect.size(); ++i)   //注意:size_t
22     {
23         iVect[i] = (i+1) * (i+3);
24     }
25
26 */
27     //初始vector :方式二
28     vector<int> iVect;
29     for(vector<int>::size_type i = 0 ; i != 20 ; ++i)
30         iVect.push_back((i+1) * (i + 3));
31
32
33     //输出vector里的元素
34     for(vector<int>::iterator iter = iVect.begin() ; iter != iVect.end() ; ++iter)
35         cout<<*iter<<" ";
36     cout<<endl;
37
38
39     vector<int>::iterator iLocation;
40     iLocation = find_if(iVect.begin(), iVect.end(), divbyfive);
41
42     if (iLocation != iVect.end())
43     {
44         cout << "第一个能被5整除的元素为:"
45              << *iLocation << endl                  //打印元素:15
46              << "元素的索引位置为:"
47              << iLocation - iVect.begin() << endl;  //打印索引位置:2
48     }
49
50     return 0;
51 }  

四. adjacent_find算法

adjacent_find算法用于查找相等或满足条件的邻近元素对。其有两种函数原型:一种在迭代器区间[first , last)上查找两个连续的元素相等时,返回元素对中第一个元素的迭代器位置。另一种是使用二元谓词判断binary_pred,查找迭代器区间 [first , last)上满足binary_pred条件的邻近元素对,未找到则返回last。

原型:

 1 <strong>template<class ForwardIterator>
 2    ForwardIterator adjacent_find(
 3       ForwardIterator _First,
 4       ForwardIterator _Last
 5       );
 6 template<class ForwardIterator , class BinaryPredicate>
 7    ForwardIterator adjacent_find(
 8       ForwardIterator _First,
 9       ForwardIterator _Last,
10             BinaryPredicate _Comp
11    );
12 </strong> 

举例如下:

 1 #include <algorithm>
 2 #include <list>
 3 #include <iostream>
 4
 5 using namespace std;
 6
 7 //判断X和y是否奇偶同性
 8 bool parity_equal(int x, int y)
 9 {
10     return (x - y) % 2 == 0 ? 1 : 0;
11 }
12
13 int main()
14 {
15     //初始化链表
16     list<int> iList;
17     iList.push_back(3);
18     iList.push_back(6);
19     iList.push_back(9);
20     iList.push_back(11);
21     iList.push_back(11);
22     iList.push_back(18);
23     iList.push_back(20);
24     iList.push_back(20);
25
26     //输出链表
27     list<int>::iterator iter;
28     for(iter = iList.begin(); iter != iList.end(); ++iter)
29     {
30         cout << *iter << "  ";
31     }
32     cout << endl;
33
34     //查找邻接相等的元素
35     list<int>::iterator iResult = adjacent_find(iList.begin(), iList.end());
36     if (iResult != iList.end())
37     {
38         cout << "链表中第一对相等的邻近元素为:" << endl;
39         cout << *iResult++ << endl;
40         cout << *iResult << endl;
41     }
42
43     //查找奇偶性相同的邻近元素
44     iResult = adjacent_find(iList.begin(), iList.end(), parity_equal);
45     if (iResult != iList.end())
46     {
47         cout << "链表中第一对奇偶相同的元素为:" << endl;
48         cout << *iResult++ << endl;
49         cout << *iResult << endl;
50     }
51     return 0;
52 }  

总结:

find()            :  在序列中找某个值的第一个出现

find_if()         :    在序列中符合某谓词的第一个元素

find_first_if     :    在两个序列中找匹配元素

adjacent_find     :    用于查找相等或满足条件的邻近元素对

时间: 2024-10-27 06:58:52

C++ STL算法系列2---find ,find_first_of , find_if , adjacent_find的使用的相关文章

C++ STL算法系列1---unique , unique_copy函数

 一.unique函数 类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束. 1 // sort words alphabetically so we can find the duplicates 2 sort(words.begin(), words.end()); 3 /* eliminate duplicate words: 4

C++ STL算法系列 unique

类属性算法unique的作用是从输入序列中“删除”所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围得结束. 在STL中unique函数是一个去重函数, unique的功能是去除相邻的重复元素(只保留一个),其实它并不真正把重复的元素删除,是把重复的元素移到后面去了,然后依然保存到了原数组中,然后 返回去重后最后一个元素的地址,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下

c++之STL(13) STL 算法 - 查找算法(4)find_first_of(b,e,sb,se) find_first_of(b,e,sb,se,bp)

find_first_of(b,e,sb,se) find_first_of(b,e,sb,se,bp) 使用逆向迭代器 没有find_last_of算法 STL 查找算法 find() find_if() search_n() search() find_end() find_first_of() adjacent_find() string 查找函数和STL查找算法的比较 string函数    STL算法 find()                find() rfind()      

实战c++中的vector系列--vector的遍历(stl算法、vector迭代器(不要在循环中判断不等于end())、operator[])

遍历一个vector容器有很多种方法,使用起来也是仁者见仁. 通过索引遍历: for (i = 0; i<v.size(); i++) { cout << v[i] << " "; } 迭代器遍历: for (vInt::const_iterator iter = v.begin(); iter != v.end();iter++) { cout << *iter << " "; } 算法遍历: copy(v.b

STL 算法[转 ]

STL 算法 STL算法概述 简介: STL算法部分主要由头文 件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包 含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象 注意: 编译器无法检测出所传递的迭代器是一个无效形式的迭代器,当然也无法给出算法函数错误的提示,因为迭代器并不是真实的类别,它只是

STL源码剖析——STL算法之find查找算法

前言 由于在前文的<STL算法剖析>中,源码剖析非常多,不方便学习,也不方便以后复习,这里把这些算法进行归类,对他们单独的源码剖析进行讲解.本文介绍的STL算法中的find.search查找算法.在STL源码中有关算法的函数大部分在本文介绍,包含findand find_if.adjacent_find.search.search_n.lower_bound. upper_bound. equal_range.binary_search.find_first_of.find_end相关算法,下

STL源码剖析——STL算法stl_algo.h

前言 在前面的博文中剖析了STL的数值算法.基本算法和set集合算法,本文剖析STL其他的算法,例如排序算法.合并算法.查找算法等等.在剖析的时候,会针对函数给出一些例子说明函数的使用.源码出自SGI STL中的<stl_algo.h>文件.注:本文的源码非常多,可能后续博文会对这些算法进行归类分析. STL算法剖析 #ifndef __SGI_STL_INTERNAL_ALGO_H #define __SGI_STL_INTERNAL_ALGO_H #include <stl_heap

STL 算法

STL 算法(本文转自:http://www.cnblogs.com/kzloser/archive/2012/11/02/2751424.html) 阅读目录如下: STL算法概述查找算法堆算法关系算法集合算法排列组合算法排序和通用算法删除和替换算法生成和变异算法算数算法 STL算法概述 简介: STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成.要使用 STL中的算法函数必须包含头文件<algorithm>

【转】STL算法 &lt;algorithm&gt;中各种算法解析

原文:http://blog.csdn.net/tianshuai1111/article/details/7674327 一,巡防算法 for_each(容器起始地址,容器结束地址,要执行的方法) #include <iostream> #include <algorithm> #include <vector> using namespace std; template<class T> struct plus2 { void operator()(T&