这里接着上篇stl非变易算法(一)进行总结。主要解析算法函数count、count_if、mismatch、equal、search、search_n以及find_end。给出算法函数的实现及測试用例。以下直接进入正题。

统计等于某值的容器元素个数count

count函数用于计算容器中某个给定值的出现次数。计算迭代区间[first,last)上等于val值的元素个数ret。返回计数。

//count算法函数的实现代码
template <class InputIterator, class T>typename iterator_traits<InputIterator>::difference_typecount (InputIterator first, InputIterator last, const T& val)
{typename iterator_traits<InputIterator>::difference_type  ret = 0;while (first!=last){if (*first == val) ++ret;++first;}return ret;
}
//測试用例
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;
int main(void)
{list<int> l;for(int i=0; i<100; i++)l.push_back(i%20);int num=0;int value=9;num=count(l.begin(), l.end(), value);cout << "链表中元素等于value的元素个数为: "<< num << endl;  return 0;
}


条件统计容器元素个数count_if

与count算法函数相似,count_if算法函数仅仅是使用谓词推断pred,统计迭代器区间[first,last)上满足条件的元素个数n,返回计数。

//count_if算法函数代码
template <class InputIterator, class UnaryPredicate>typename iterator_traits<InputIterator>::difference_typecount_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{typename iterator_traits<InputIterator>::difference_type n = 0;while (first!=last) {if (pred(*first)) ++n;++first;}return n;
}
//測试用例
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;//是否为奇数
bool IsOdd (int i)
{ return ((i%2)==1);
}int main ()
{vector<int> v;for (int i=1; i<10; i++) v.push_back(i); int mycount = count_if (v.begin(), v.end(), IsOdd);cout << "v容器包括 " << mycount  << " 奇数值。

\n"

; return 0; }


元素不匹配查找mismatch

mismatch算法函数比較两个序列,找出首个不匹配元素的位置。

找出迭代区间[first1,last1)上第一个元素i,他与迭代区间[first2,first2+(last1-first1))上的元素(first2+(i-first1))不相等(或不满足二元谓词pred条件)。通过pair返回这两个元素的迭代器。指示不匹配元素 的位置。

)
template <class InputIterator1, class InputIterator2>pair<InputIterator1, InputIterator2>mismatch (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2);template <class InputIterator1, class InputIterator2, class BinaryPredicate>pair<InputIterator1, InputIterator2>mismatch (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, BinaryPredicate pred);
  • mismatch函数的模板类型选择了不同的符号InputIterator1和InputIterator2,表示可取不同的容器迭代器。
//mismatch算法函数的代码
template <class InputIterator1, class InputIterator2>pair<InputIterator1, InputIterator2>mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{while ( (first1!=last1) && (*first1==*first2) )  // or: pred(*first1,*first2), for version 2{ ++first1; ++first2; }return std::make_pair(first1,first2);
}       
//測试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
bool strEqual(const char* s1, const char* s2){return strcmp(s1, s2) == 0 ?

1 : 0; } int main(void) { //初始化向量v1、v2 vector<int> 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<int>::iterator, vector<int>::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不同样,不匹配的数是:\n" << *result1.first << endl << *result1.second << endl << endl; //初始化字符串s1、s2 char* s1[] = {"apple", "pear", "watermelon", "banana", "grape"}; char* s2[] = {"apple", "pears", "watermelons", "banana", "grape"}; //s1和s2不匹配检查 pair<char**, char**> result2=mismatch(s1, s1+5, s2, strEqual); if(result2.first == s1+5 && result2.second ==s2+5) cout << "s1和s2全然同样" << endl; else cout << "s1与s2不同样,不匹配的字符串为:\n" << s1[result2.first -s1] << endl << s2[result2.second -s2] << endl << endl; return 0; }


元素相等推断equal

相似mismatch、equal算法函数也是逐一比較两个序列的元素是否相等,仅仅是equal函数返回true/false,不返回迭代器值。也是有例如以下两种使用原型。假设迭代区间[first1,last1)和迭代器区间[first2,first2+(last1-first1))上的元素相等(或满足二元谓词推断条件pred),返回true,否则返回false。

template <class InputIterator1, class InputIterator2>bool equal (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2);template <class InputIterator1, class InputIterator2, class BinaryPredicate>bool equal (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, BinaryPredicate pred);
//equal算法函数的代码
template <class InputIterator1, class InputIterator2>bool equal ( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 )
{while (first1!=last1) {if (!(*first1 == *first2))   // or: if (!pred(*first1,*first2)), for version 2return false;++first1; ++first2;}return true;
}
//測试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;bool absEqual(int a, int b){return (a== abs(b) || abs(a) == b) ? 1:0;
}int main(void)
{//初始化向量v1、v2vector <int> v1(5);vector <int> v2(5);for(unsigned int i = 0; i < v1.size(); i++) {v1[i] = i;v2[i] = -1 * i;}//v1、v2相等检查if(equal(v1.begin(), v1.end(), v2.begin(), absEqual))cout << "v1和v2元素的绝对值全然相等" << endl;elsecout << "v1和v2元素的绝对值不全然相等" << endl;return 0;
}


子序列搜索search

search算法函数在一个序列中搜索与还有一个序列匹配的子序列。有例如以下两个原型。在迭代器区间[first1,last1)上找出与迭代器区间[first2,last2)全然匹配(或满足二元谓词推断pred)的子序列,返回子序列首个元素的迭代器值,或返回last1表示没有匹配的子序列。

template <class ForwardIterator1, class ForwardIterator2>ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2);template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2,BinaryPredicate pred);
//search算法函数的代码
template<class ForwardIterator1, class ForwardIterator2>ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2)
{if (first2==last2) return first1;  while (first1!=last1){ForwardIterator1 it1 = first1;ForwardIterator2 it2 = first2;// or: while (pred(*it1,*it2)) for version 2while (*it1==*it2) {   ++it1; ++it2;if (it2==last2) return first1;if (it1==last1) return last1;}++first1;}return last1;
}     
//測试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;int main(void)
{//初始化向量v1={5, 6, 7, 8, 9 } vector<int> v1; v1.push_back(5);v1.push_back(6);v1.push_back(7);v1.push_back(8);v1.push_back(9);//初始化向量v2={7, 8}vector<int> v2;v2.push_back(7);v2.push_back(8);//检查v2是否构成v1的子序列vector<int>::iterator iterLocation;iterLocation=search(v1.begin(), v1.end(), v2.begin(), v2.end());//打印从v1[2]開始匹配if(iterLocation != v1.end())cout << "v2的元素包括在v1中,起始元素为"  << "v1[" << iterLocation - v1.begin() << "]\n";else cout << "v2的元素不包括在v1中" << endl;return 0;
}


反复元素子序列搜索search_n

search_n算法函数搜索序列中是否有一系列元素值均为某个给定值的子序列。

有例如以下两个原型。分别在迭代器区间[first,last)上搜索是否有count个连续元素,其值均等于value(或满足谓词推断pred的条件)。返回子序列首元素的迭代器,或返回last表示没有反复元素的子序列。

template <class ForwardIterator, class Size, class T>ForwardIterator search_n (ForwardIterator first, ForwardIterator last,Size count, const T& val);template <class ForwardIterator, class Size, class T, class BinaryPredicate>ForwardIterator search_n ( ForwardIterator first, ForwardIterator last,Size count, const T& val, BinaryPredicate pred );    
//search_n算法函数的代码
template<class ForwardIterator, class Size, class T>ForwardIterator search_n (ForwardIterator first, ForwardIterator last,Size count, const T& val)
{ForwardIterator it, limit;Size i;limit=first; std::advance(limit,std::distance(first,last)-count);while (first!=limit){it = first; i=0;while (*it==val)       // or: while (pred(*it,val)) for the pred version{ ++it; if (++i==count) return first; }++first;}return last;
} 
//測试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{vector<int> v;v.push_back(1);v.push_back(8);v.push_back(6);v.push_back(6);v.push_back(9);vector<int>::iterator iLocation;iLocation=search_n(v.begin(), v.end(), 2, 6);if(iLocation != v.end())cout << "在v中找到2个连续的元素6" << endl;else cout << "v中没有2个连续的元素6" << endl;return 0;
}       


最后一个子序列搜索find_end

find_end算法函数在一个序列中搜索出最后一个与还有一序列匹配的子序列。有例如以下两个使用原型。

在迭代器区间[first1,last1)中搜索出与迭代器区间[first2,last2)元素匹配的子序列。返回首元素的迭代器或返回last1,表示没有子序列匹配。

template <class ForwardIterator1, class ForwardIterator2>ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2);template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2,BinaryPredicate pred);          
//find_end函数实现
template<class ForwardIterator1, class ForwardIterator2>ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1,ForwardIterator2 first2, ForwardIterator2 last2)
{if (first2==last2) return last1;  // specified in C++11ForwardIterator1 ret = last1;while (first1!=last1){ForwardIterator1 it1 = first1;ForwardIterator2 it2 = first2;while (*it1==*it2) {    // or: while (pred(*it1,*it2)) for version (2)++it1; ++it2;if (it2==last2) { ret=first1; break; }if (it1==last1) return ret;}++first1;}return ret;
}
//測试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main(void)
{   //初始化向量v1={-5, 1, 2, -6, -8, 1, 2, -11}vector<int> 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<int> v2;v2.push_back(1);v2.push_back(2);//v1中查找最后一个子序列v2vector<int>::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;
}     


完结。

转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/46849279

转载于:https://www.cnblogs.com/bhlsheji/p/5251484.html

stl非变易算法(二)相关推荐

  1. stl非变易算法(一)

    C++ STL的非变易算法是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理.元素查找.子序列搜索.统计和匹配.非变易算法具有极为广泛的适用性,基本上可应用于各种容器. 逐个容器元素for_e ...

  2. stl变易算法(一)

    C++ STL的变易算法是一组能够修改容器元素数据的模板函数,可进行序列容器的复制.交换.替换.填充.移除.旋转等.这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或向前迭代器.或双向迭 ...

  3. stl变易算法(二)

    本篇接着前篇stl变易算法(一)继续讲述变易算法.主要介绍transform.replace.replace_if.replace_copy以及replace_copy_if的用法及实现代码,并给出测 ...

  4. stl变易算法(三)

    本篇接着前面stl变易算法(一)和stl变易算法(二)继续讲述变易算法.这里将介绍完余下的变易算法,主要有:填充fill.n次填充fill_n.随机生成元素generate.随机生成n个元素gener ...

  5. 使用pytorch从零开始实现YOLO-V3目标检测算法 (二)

    原文:https://blog.csdn.net/u011520516/article/details/80212960 博客翻译 这是从零开始实现YOLO v3检测器的教程的第2部分.在上一节中,我 ...

  6. 非变动性算法源代码分析与使用示例( for_each、min_element 、find_if、search 等)...

    非变动性算法代码分析与示例: 一.for_each C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14   // TEMPLATE FUNCTION for_each ...

  7. 高级数据结构与算法 | 二叉搜索树(Binary Search Tree)

    文章目录 二叉搜索树的概念 二叉搜索树的作用 排序 查找 实现思路 查找 插入 删除 删除.拷贝等 代码实现 K模型 KV模型 二叉搜索树的概念 二叉搜索树又叫做二叉排序树,他是一个具有以下特性的二叉 ...

  8. STL中sort算法简析

    STL里sort算法简析 文章目录 STL里sort算法简析 一.引入 二.正解 三.源码 **`sort的源码`**: **`其中,__introsort_loop便是内省式排序:`** 插入排序 ...

  9. c++中STL的常用算法--1(函数对象,谓词,内建函数对象)

    函数对象 重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载"()"操作符,使得 ...

最新文章

  1. fibonacci 数列及其应用
  2. 共享可写节包含重定位_PE结构学习01-DOS头-NT头-节表头
  3. Android可输入的下拉框,android 可编辑的下拉框 Demo
  4. 决胜B端第2版(4):需求分析的十三要素五步法
  5. angle-class
  6. 2011Google校园招聘笔试题
  7. linux安装 icc编译器,安装 Intel Compiler (ifort icc icpc)
  8. SCAU_WeiShenWahle 之省赛任务
  9. beyond唱片_如何数字化您的唱片
  10. 用泰勒公式求近似值_满足多个条件求最值,用这2个函数组合,写出来的公式如此简单...
  11. Unity Application Block 1.0系列文章
  12. Android编程之DialogFragment源码详解(二)
  13. pycharm 里面配置pip,安装库
  14. CSDN - 屏蔽百度广告
  15. 如何打出好看的数学公式呢?
  16. Ubuntu 12.04重启后丢失resolv.conf问题
  17. 金笛JDMAIL邮件系统办公管理—文件中转站
  18. TM1638数码管显示板(8数码管+16按键)单片机C语言驱动程序(显示功能)
  19. vmware linux虚拟机网络配置
  20. 计算机软件方面的基金,天天基金

热门文章

  1. 比explain更加详细的分析计划:Query Profiler
  2. 【聊透SpringMVC】自学java和三大框架要多久
  3. 凭借这份Java面试题集,java上传文件夹
  4. 我们究竟还要学习哪些Android知识?专题解析
  5. 【机器学习】通俗的决策树算法讲解和应用
  6. 【Network Security!】密码攻击的原理和方法
  7. 使用es6中import和export报错
  8. js实现图片从左到右循环播放
  9. (2)搞一搞 seata 之 Spring Cloud 整合
  10. 网站不同优化时段的优化方法介绍