非变易算法
C++ STL的非变易算法(Non-mutating),是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理等操作。
8、元素不匹配算法mismatch
template
pair mismatch(InIt1 first, InIt1 last, InIt2 x);
找出迭代器区间[first1,last1)上第一个元素*i,它与迭代器区间[first2,first2+(last1-first1))上的元素*(first2+(i-first1))不相等(或不满足谓词pr条件)。通过pair对象返回这两个元素的迭代器,指示不匹配元素位置,如果返回的pair对象是两个未位置的迭代器end_iterator,表明两个序列完全相同。
注意InIt1与InIt2原则上是两种不同的迭代器类型,当然可以相同。
template
pair mismatch(InIt1 first, InIt1 last,
InIt2 x, Pred pr);
其实现如下所示:
template _InputIter1, typename _InputIter2>
pair<_InputIter1, _InputIter2>
mismatch(_InputIter1 __first1, _InputIter1 __last1,
_InputIter2 __first2)
{
while (__first1 != __last1 && *__first1 == *__first2) {
++__first1;
++__first2;
}
return pair<_InputIter1, _InputIter2>(__first1, __first2);
}
如下所示示例:
#include
#include
#include
#include "string"
using namespace std;
bool strEqual(const string s1, const string s2){
return s1==s2 ? 1 : 0;
}
int main(void){
using namespace std;
//初始化向量v1、v2
vector v1, v2;
v1.push_back(2);
v1.push_back(0);
v1.push_back(0);
v1.push_back(6);
v2.push_back(2);
v2.push_back(0);
v2.push_back(0);
v2.push_back(7);
//v1和v2不匹配检查
pair<vector::iterator, vector::iterator> result1=
mismatch(v1.begin(), v1.end(), v2.begin());
if(result1.first == v1.end() && result1.second == v1.end())
cout << "v1和v2完全相同" << endl;
else
cout << "v1和v2不相同,不匹配的数是:"
<< *result1.first << endl
<< *result1.second << endl << endl;
//初始化字符串s1、s2
string s1[] = {"apple", "pear", "watermelon", "banana", "grape"};
string s2[] = {"apple", "pears", "watermelons", "banana", "grape"};
//s1和s2不匹配检查
pair<string*, string*> result2=mismatch(s1, s1+5, s2, strEqual);
if(result2.first == s1+5 && result2.second ==s2+5)
cout << "s1和s2完全相同" << endl;
else
cout << "s1与s2不相同,不匹配的字符串为:"
<< s1[result2.first -s1] << endl
<< s2[result2.second -s2] << endl << endl;
return 0;
}
9、元素相等判断equal
逐一比较两个序列的元素是否相等,返回true/false。如果迭代器区间[first1,last1)与迭代器区间[first2,first2+(last1-first1))上的元素相等(或满足谓词pr条件)。返回true,否则返回false。
template
bool equal(InIt1 first, InIt1 last, InIt2 x);
template
bool equal(InIt1 first, InIt1 last, InIt2 x, Pred pr);
10、子序列搜索search
在一个序列中搜索与另一个序列匹配的子序列。
template
FwdIt1 search(FwdIt1 first1, FwdIt1 last1,
FwdIt2 first2, FwdIt2 last2);
在区间[first1,last1)上找出与迭代器区间[first2,last2)完全匹配(或满足谓词pr条件)的子序列,返回子序列的首个元素的迭代器值,或返回last1表示没有匹配的子序列。
template
FwdIt1 search(FwdIt1 first1, FwdIt1 last1,
FwdIt2 first2, FwdIt2 last2, Pred pr);
11、重复元素子序列搜索search_n
搜索序列中是否有一系列值均为某个给定值的子序列。
template
FwdIt search_n(FwdIt first, FwdIt last,
Dist n, const T& val);
在区间[first,last)上搜索是滞有n个连接元素,其值为val(或满足谓词pr条件),返回子序列的首个元素的迭代器,或返回last表示没有。
template
FwdIt search_n(FwdIt first, FwdIt last,
Dist n, const T& val, Pred pr);
12、最后一个子序列搜索find_end
搜索出最后一个与另一序列匹配的子序列。
template
FwdIt1 find_end(FwdIt1 first1, FwdIt1 last1,
FwdIt2 first2, FwdIt2 last2);
在迭代器区间[first1,last1)中搜索与迭代器[first1,last2)元素匹配的最后一个子序列,返回找到的首元素的迭代器,或返回last1,表示没有子序列匹配。
template
FwdIt1 find_end(FwdIt1 first1, FwdIt1 last1,
FwdIt2 first2, FwdIt2 last2, Pred pr);
#include
#include
#include
int main(void){
using namespace std;
//初始化向量v1={-5, 1, 2, -6, -8, 1, 2, -11}
vector v1;
v1.push_back(-5);
v1.push_back(1);
v1.push_back(2);
v1.push_back(-6);
v1.push_back(-8);
v1.push_back(1);
v1.push_back(2);
v1.push_back(-11);
//初始化向量v2={1, 2}
vector v2;
v2.push_back(1);
v2.push_back(2);
//v1中查找最后一个子序列v2
vector::iterator iLocation;
iLocation=find_end(v1.begin(), v1.end(), v2.begin(), v2.end());
//打印子序列在v1的起始位置v[5]
if(iLocation != v1.end())
cout << "v1中找到最后一个匹配v2的子序列,位置在"
<< "v1[" << iLocation - v1.begin() << "]" << endl;
return 0;
}