equal()算法 检验相等性
bool
equal(InputIterator1 beg,InputIterator1 end,
InputIterator2 cmpBeg)
bool
equal(InputIterator1 beg,InputIterator1 end,
InputIterator2 cmpBeg,BinaryPredicate op)
- 第一形式判断区间[beg,end)内的元素是否都和“以cmpBeg 开头的区间”内的元素相等
- 第二形式判断区间[beg,end)内的元素和“以cmpBeg开头的区间”内的对应元素是否都能够使以下二元判断式为true: op(elem,cmpElem)
- op在函数调用过程中不应该改变自身状态,并且op不应改动传入的参数
- 调用者必须确保“以cmpBeg开头的区间”内含足够元素
- 当序列不相等时,如果想要了解其间的不同,应使用mismatch()算法
下面用一个例子展示equal()算法两种形式的用法。第一次用来判断两个区间的元素是否相等,第二次调用使用一个辅助判断式,检查两个序列中的元素是否具备一一对应的奇偶关系:
#include"algostuff.h"
using namespace std;
bool bothEvenOrodd(int elem1, int elem2)
{
return elem1 % 2 == elem2 % 2;
}
int main()
{
vector<int> col1;
list<int> col2;
INSERT_ELEMENTS(col1,1,7);
INSERT_ELEMENTS(col2, 3, 9);
PRINT_ELEMENTS(col1, "col1: "); //col1: 1 2 3 4 5 6 7
PRINT_ELEMENTS(col2, "col2: "); //col2: 3 4 5 6 7 8 9
//check whether both collection are equal
if (equal(col1.begin(), col1.end(), col2.begin()))
{
cout << "col1==col2" << endl;
}
else
{
cout << "col1!=col2" << endl;
}
//check for corresponding even and odd elements
if (equal(col1.begin(), col1.end(), col2.begin(), bothEvenOrodd))
{
cout << "even and odd elements correspond" << endl;
}
else
{
cout << "even and odd elements do not correspond" << endl;
}
}
mismatch()算法 搜寻第一处不同点
pair<InputIterator1,InputIterator2>
mismatch(InputIterator1 beg,InputIterator1 end,
InputIterator2 cmpBeg)
pair<InputIterator1,InputIterator2>
mismatch(InputIterator1 beg,InputIterator1 end,
InputIterator2 cmpBeg,
BinaryPredicate op)
- 第一形式返回区间[beg,end)和“以cmpBeg开头的区间”之中第一组两两相异的对应元素
- 第二形式返回区间[beg,end)和“以cmpBeg开头的区间”之中第一组“使以下二元判断式为false”的对应元素: op(elem,cmpElem)
- 如果没有找到相异点,就返回一个pair,以end和第二序列的对应元素组成。这并不意味着两个序列相等,因为第二个序列可能包含较多的元素
- op在函数调用过程中不应该改变自身状态,并且op不应改动传入的参数
- 调用者必须确保“以cmpBeg开头的区间”内含足够元素
下面展示这个程序的用法:
第一次调用mismatch()用以搜寻第一对互异的对应元素,如果找到了就把它们的值写到标准输出装置。第二次调用用来搜寻符合以下条件的第一对元素,“第一序列的元素比第二序列的对应元素大”,找到后返回这两个元素
#include"algostuff.h"
using namespace std;
int main()
{
vector<int> col1;
list<int> col2;
INSERT_ELEMENTS(col1, 1, 6);
for (int i = 1; i <= 16; i *= 2)
{
col2.push_back(i);
}
col2.push_back(3);
PRINT_ELEMENTS(col1, "col1: "); //col1: 1 2 3 4 5 6
PRINT_ELEMENTS(col2, "col2: "); //col2: 1 2 4 8 16 3
//find first mismatch
pair<vector<int>::iterator, list<int>::iterator> values;
values = mismatch(col1.begin(), col1.end(), col2.begin());
if (values.first == col1.end())
{
cout << "no mismatch" << endl;
}
else
{
cout << "first mismatch: "
<< *(values.first) << " and " << *(values.second) << endl;
}
//find first position where the element of col1 is not less than the corresponding element of col2
values = mismatch(col1.begin(), col1.end(), //first range
col2.begin(), //second range
less_equal<int>()); //criterion
if (values.first == col1.end())
{
cout << "always less-or-equal" << endl;
}
else
{
cout << "not less-or-equal: "
<< *(values.first) << " and "
<< *(values.second) << endl;
}
}
程序运行结果如下