非变易算法

非变易算法

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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值