C++ STL算法系列5---equal() , mismatch()

简介:

equal和mismatch算法的功能是比较容器中的两个区间内的元素。这两个算法各有3个参数first1,last1和first2.如果对 于区间[first1,last1)内所有的first1+i,first1+i和first2所在位置处的元素都相等,则equal算法返回真,否则返 回假。mismatch算法的返回值是由两个迭代器first1+i和first2+i组成的一个pair,表示第1对不相等的元素的位置。如果没有找到 不相等的元素,则返回last1和first2+(last1-first1)。因此,语句equal(first1,last1,first2)和mismatch(first1,last1,first2).first==last1是等价的.

复制代码
 1 // Illustrating the generic equal and mismatch algorithms
 2 #include <iostream>
 3 #include <cassert>
 4 #include <algorithm>
 5 #include <string>
 6 #include <list>
 7 #include <deque>
 8 #include <vector>
 9 using namespace std;
10 
11 int main()
12 {
13   cout << "Illustrating the generic equal "
14        << "and mismatch algorithms." << endl;
15   list<string> driver_list;
16   vector<string> vec;
17   deque<string> deq;
18 
19   driver_list.insert(driver_list.end(), "Clark");
20   driver_list.insert(driver_list.end(), "Rindt");
21   driver_list.insert(driver_list.end(), "Senna");
22 
23   vec.insert(vec.end(), "Clark");
24   vec.insert(vec.end(), "Rindt");
25   vec.insert(vec.end(), "Senna");
26   vec.insert(vec.end(), "Berger");
27 
28   deq.insert(deq.end(), "Clark");
29   deq.insert(deq.end(), "Berger");
30 
31   // Show that driver_list and the first 3 elements of
32   // vec are equal in all corresponding positions:
33   assert (equal(driver_list.begin(), driver_list.end(),
34                 vec.begin()));
35 
36   // Show that deq and the first 2 elements of driver_list
37   // are not equal in all corresponding positions:
38   assert (!equal(deq.begin(), deq.end(),
39                  driver_list.begin()));
40 
41   // Find the corresponding positions in deq and driver_list
42   // at which unequal elements first occur:
43   pair<deque<string>::iterator, list<string>::iterator>
44     pair1 = mismatch(deq.begin(), deq.end(),
45                      driver_list.begin());
46 
47   if (pair1.first != deq.end())
48     cout << "First disagreement in deq and driver_list:\n  "
49          << *(pair1.first) << " and " << *(pair1.second)
50          << endl;
51   return 0;
52 }
复制代码

 

equal算法类似于mismatch,equal算法也是逐一比较两个序列的元素是否相等,只是equal函数的返回值为bool值 true/false,不是返回迭代器值。它有如下两个原型,如果迭代器区间[first1,last1)和迭代器区间[first2, first2+(last1 - first1))上的元素相等(或者满足二元谓词判断条件binary_pred) ,返回true,否则返回false。

  函数原型:

复制代码
 1 template<class InputIterator1, class InputIterator2>
 2    bool equal(
 3       InputIterator1 _First1, 
 4       InputIterator1 _Last1, 
 5       InputIterator2 _First2
 6       );
 7 template<class InputIterator1, class InputIterator2, class BinaryPredicate>
 8    bool equal(
 9       InputIterator1 _First1, 
10       InputIterator1 _Last1, 
11       InputIterator2 _First2, 
12       BinaryPredicate _Comp
13       );
14  
复制代码

example:

利用二元谓词判断条件absEqual,判断出两个vector向量容器的元素均绝对值相等。

复制代码
 1 #include <algorithm>  
 2 #include <vector>  
 3 #include <iostream>  
 4   
 5 using namespace std;  
 6   
 7 bool absEqual(int a, int b)  
 8 {  
 9     return (a == abs(b) || b == abs(a)) ? true : false;  
10 }  
11   
12 int main()  
13 {  
14     vector<int> ivect1(5);  
15     vector<int> ivect2(5);  
16   
17     for (vector<int>::size_type i = 0; i < ivect1.size(); ++i)  
18     {  
19         ivect1[i] = i;  
20         ivect2[i] = (-1) * i;  
21     }  
22     if ( equal( ivect1.begin(), ivect1.end(), ivect2.begin(), absEqual ) )  
23     {  
24         cout << "ivect1 和 ivect2 元素的绝对值完全相等" << endl;  
25     }   
26     else  
27     {  
28         cout << "ivect1 和 ivect2 元素的绝对值不完全相等" << endl;  
29     }  
30     return 0;  
31 }  
复制代码

 




本文转自夏雪冬日博客园博客,原文链接:http://www.cnblogs.com/heyonggang/p/3264844.html,如需转载请自行联系原作者

目录
相关文章
|
1月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
390 0
高精度算法(加、减、乘、除,使用c++实现)
|
1月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
22 0
|
1月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
1月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
1月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
1月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
1月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
1月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
1月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)
|
5天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
23 4