C++两个区间的比较?——STL之equal()算法和mismatch()算法

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 col1;
	list 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
mismatch(InputIterator1 beg,InputIterator1 end,
        InputIterator2 cmpBeg)


pair
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 col1;
	list 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::iterator, list::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());							//criterion
	if (values.first == col1.end())
	{
		cout << "always less-or-equal" << endl;
	}
	else
	{
		cout << "not less-or-equal: "
			<< *(values.first) << " and "
			<< *(values.second) << endl;
	}
}

 程序运行结果如下

你可能感兴趣的:(c++,算法,开发语言)