博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
stl非变易算法(二)
阅读量:7240 次
发布时间:2019-06-29

本文共 10437 字,大约阅读时间需要 34 分钟。

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

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

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

//count算法函数的实现代码template 
typename iterator_traits
::difference_type count (InputIterator first, InputIterator last, const T& val){ typename iterator_traits
::difference_type ret = 0; while (first!=last) { if (*first == val) ++ret; ++first; } return ret;}
//測试用例#include 
#include
#include
using namespace std;int main(void){ list
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;}

http://blog.csdn.net/lsh_2013?viewmode=list


条件统计容器元素个数count_if

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

//count_if算法函数代码template 
typename iterator_traits
::difference_type count_if (InputIterator first, InputIterator last, UnaryPredicate pred){ typename iterator_traits
::difference_type n = 0; while (first!=last) { if (pred(*first)) ++n; ++first; } return n;}
//測试用例#include 
#include
#include
using namespace std;//是否为奇数bool IsOdd (int i) { return ((i%2)==1); }int main (){ vector
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; }

http://blog.csdn.net/lsh_2013?</p><p>viewmode=list


元素不匹配查找mismatch

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

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

)   template 
pair
mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2);template
pair
mismatch (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred);
  • mismatch函数的模板类型选择了不同的符号InputIterator1和InputIterator2,表示可取不同的容器迭代器。

//mismatch算法函数的代码template 
pair
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 
#include
#include
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; }

http://blog.csdn.net/lsh_2013?viewmode=list


元素相等推断equal

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

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

http://blog.csdn.net/lsh_2013?</p><p>viewmode=list


子序列搜索search

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

template 
ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2);template
ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
//search算法函数的代码template
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 2 while (*it1==*it2) { ++it1; ++it2; if (it2==last2) return first1; if (it1==last1) return last1; } ++first1; } return last1;}
//測试用例#include 
#include
#include
using namespace std;int main(void){ //初始化向量v1={5, 6, 7, 8, 9 } vector
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
v2; v2.push_back(7); v2.push_back(8); //检查v2是否构成v1的子序列 vector
::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;}

http://blog.csdn.net/lsh_2013?viewmode=list


反复元素子序列搜索search_n

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

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

template 
ForwardIterator search_n (ForwardIterator first, ForwardIterator last, Size count, const T& val);template
ForwardIterator search_n ( ForwardIterator first, ForwardIterator last, Size count, const T& val, BinaryPredicate pred );
//search_n算法函数的代码template
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 
#include
#include
using namespace std;int main(void){ vector
v; v.push_back(1); v.push_back(8); v.push_back(6); v.push_back(6); v.push_back(9); vector
::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;}

http://blog.csdn.net/lsh_2013?</p><p>viewmode=list


最后一个子序列搜索find_end

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

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

template 
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2);template
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred);
//find_end函数实现template
ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2){ if (first2==last2) return last1; // specified in C++11 ForwardIterator1 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 
#include
#include
using namespace std;int main(void){ //初始化向量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;}

http://blog.csdn.net/lsh_2013?</p><p>viewmode=list


完结。

转载请注明出处:

你可能感兴趣的文章
MapReduce项目之气温统计
查看>>
PHP登录及处理
查看>>
Spring Bean的生命周期(非常详细)
查看>>
《Unix环境高级编程》读书笔记 第8章-进程控制
查看>>
login/logout切换
查看>>
销毁react组件的方法
查看>>
获取VirtualBox COM对象失败,Unable to start the virtual device
查看>>
磁盘阵列柜 和存储有什么区别
查看>>
requests bs4 爬取 资讯 图片
查看>>
zabbix 调用python脚本监控 磁盘剩余空间(创建模版,创建监控项,创建触发器)...
查看>>
LeetCode:453. Minimum Moves to Equal Array Elements
查看>>
python之logging模块
查看>>
JDBC(1)——获取数据库连接
查看>>
并查集专题2
查看>>
ASP.NET中的验证控件
查看>>
zookeeper3.4.5+Hbase1.2.6安装教程
查看>>
20160811
查看>>
Redis数据库概述
查看>>
如何管理团队知识?快速搭建一套管理工具
查看>>
BZOJ 1191: [HNOI2006]超级英雄Hero
查看>>