这里接着上篇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_type
count (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_type
count_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;
}

viewmode=list" title="">


元素不匹配查找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 2
return 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、v2
vector <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;
else
cout << "v1和v2元素的绝对值不全然相等" << endl;
return 0;
}

viewmode=list" title="">


子序列搜索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 2
while (*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;
}

viewmode=list" title="">


最后一个子序列搜索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++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 <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中查找最后一个子序列v2
vector<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;
}

viewmode=list" title="">


完结。

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

stl非变易算法(二)的更多相关文章

  1. STL非变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1394600460.html 原创:ST ...

  2. STL非变易算法

    非变易算法:原则上不会变更操作数据的算法. [1]    for_each:逐个容器元素,原型for_each(InputIter first, InputIter last, Function f) ...

  3. 变易算法 - STL算法

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/mutating-algorithms.h ...

  4. stl变易算法(一)

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

  5. stl变易算法(三)

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

  6. STL中的算法

    STL中的所有算法(70个) 参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/ding ...

  7. c/c++ 模板与STL小例子系列<二> 模板类与友元函数

    c/c++ 模板与STL小例子系列 模板类与友元函数 比如某个类是个模板类D,有个需求是需要重载D的operator<<函数,这时就需要用到友元. 实现这样的友元需要3个必要步骤 1,在模 ...

  8. 《Java并发编程实战》笔记-非阻塞算法

    如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败和挂起,那么这种算法就被称为非阻塞算法.如果在算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也被称为无锁(Lock-Free)算法 ...

  9. STL学习笔记--算法

    关于STL算法需要注意的是: (1) 所有STL算法被设计用来处理一个或多个迭代器区间.第一个区间通常以起点和终点表示,至于其他区间,多数情况下只需提供起点即可,其终点可自动以第一区间的元素数推导出来 ...

随机推荐

  1. Xcode Coule not launch "aaa" press launch failed:timed out waiting for app launch

    遇见这个问题 可能是 由于 runapp 的时候设置里面 设置为release了. 解决办法是:见图 build configuration 设置成 debug 状态就OK了. 要是上面的不行就试一下 ...

  2. ORACLE-Kill 杀死正在执行的Oracle存储过程和死锁语句

    ORACLE-Kill 杀死正在执行的Oracle存储过程和死锁语句 存储过程 1.找到正在执行的存储过程的 sid ,serial# select   b.sid,b.SERIAL#,a.OBJEC ...

  3. libcurl编译

    下载: git://github.com/bagder/curl.git openssl: openssl编译   for linux or mingw:./buildconf./configure ...

  4. Android之CookieStore的持久化

    CookieStore是一个对象,有的服务端 ,比如.net,保持登录状态不是用httpclient.addHeader(“cookie”,SessionId),而是用httppost.setCook ...

  5. CSV 客座文章系列:KGroup 通过 Windows Azure 将 Qoob 内容管理发布到云中

    编辑人员注释: 今天这篇文章由 KGroup 首席软件架构师兼研发部主管 Jody Donetti 与 KGroup 技术总监 Simone Procopio 共同撰写,介绍了 KGroup 如何使用 ...

  6. NOI2011 Day1

    NOI2011 Day1 兔农 题目描述:\(fib[1]=fib[2]=1, fib[i]=fib[i-2]+fib[i-1] (i\geq 3)\),若\(fib[i] \equiv 1(mod ...

  7. java--jsp+ssh+select动态结合数据和选择(解)

    在三层体系结构和jsp合并项目,如何实现select动态绑定数据和动态选择指定的行?让我们来看看下面的: 1.首先定义一个Bean分类.它用于实例select的结合数据中的每一个id和name: pu ...

  8. Codeforces Round #262 (Div. 2) B

    题目: B. Little Dima and Equation time limit per test 1 second memory limit per test 256 megabytes inp ...

  9. 算法精解(C语言描述) 第3章 读书笔记

    第3章 递归 1.基本递归 假设想计算整数n的阶乘,比如4!=4×3×2×1. 迭代法:循环遍历其中的每一个数,然后与它之前的数相乘作为结果再参与下一次计算.可正式定义为:n! = (n)(n-1)( ...

  10. 队列的实现 -- 数据结构与算法的javascript描述 第五章

    队列也是列表的一种,有不同于列表的规则. 先进先出 入队方法 出队方法 可以找到队首 可以找到队尾 可以查看队列有多长 可以查看队列是否为空 这是一个基本的需求,围绕他来实现,当然我们可以自己扩展列表 ...