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


逐个容器元素for_each

C++ STL提供了一个for_each函数,用于对容器的元素进行循环操作。它对迭代区间[first, last)所指的每一个元素,执行由单参函数对象fn所定义的操作。原型如下:

template<class InputIterator, class Function>Function for_each(InputIterator first, InputIterator last, Function fn)
{while (first!=last) //循环遍历{fn (*first);//调用fn进行操作++first;}return fn;
}
//实例
#include <algorithm>
#include <list>
#include <iostream>
using namespace std;
struct print{int count; //打印的元素计数print(){count=0;}void operator()(int x){cout << 3*x << endl;count++;}
};int main(void){//双向链表初始化list<int> l;l.push_back(29);l.push_back(32);l.push_back(16);l.push_back(22);l.push_back(27);//打印链表的元素print p=for_each(l.begin(),l.end(),print());//打印的元素个数cout << p.count << endl;return 0;
}


查找容器元素find

find算法函数用来查找等于某值的元素。它在迭代器区间[first,last)上查找等于value值的元素,如果迭代器i所指的元素满足*i==value,则返回迭代器i。未找到满足条件的元素,返回last。

//find算法函数的代码
template<class InputIterator, class T>InputIterator find (InputIterator first, InputIterator last, const T& val)
{while (first!=last) {if (*first==val) return first;++first;}return last;
}
//实例
#include <algorithm>
#include <list>
#include <iostream>int main(void){using namespace std;//双向链表初始化list<int> l;l.push_back(10);l.push_back(18);l.push_back(26);l.push_back(26);l.push_back(30);//查找元素26list<int>::iterator iLocation=find(l.begin(),l.end(),26);if(iLocation != l.end())cout << "找到元素26" << endl;//打印元素18cout << "前一个元素为" << *(--iLocation) << endl;return 0;
}


条件查找容器元素find_if

find_if算法函数是find的一个判断版本,它利用bool值谓词判断pred,检查迭代区间[first,last)上的每一个元素,如果迭代器i满足pred(*i)==true,表示找到元素并返回迭代器i;未找到元素,返回末位置last。

template<class InputIterator, class UnaryPredicate>InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{while (first!=last) {if (pred(*first)) return first;++first;}return last;
}
//实例
#include <algorithm>
#include <vector>
#include <iostream>bool divby5(int x){return x % 5 ? 0 : 1;
}int main(void){using namespace std;//初始化vectorvector<int> v(20);for(unsigned int i=0; i<v.size(); i++)v[i]=(i+1)*(i+3);vector<int>::iterator iLocation;iLocation=find_if(v.begin(), v.end(), divby5);if(iLocation != v.end())cout << "找到第一个能被5整除的元素" << *iLocation << endl   << "元素的索引位置为"<< iLocation - v.begin() << endl; system("pause");return 0;
}


邻近查找容器元素adjacent_find

adjacent_find算法函数用于查找相等或满足条件的邻近元素对。它有两个使用原型如下:

  • 在迭代区间[first,last)上查找到有两个连续的元素相等,就返回头一个元素的迭代器位置。
template <class ForwardIterator>ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last)
{if (first != last){ForwardIterator next=first; ++next;while (next != last) {if (*first == *next)     return first;++first; ++next;}}return last;
}
  • 使用二元谓词判断binary_pred,查找[first,last)迭代器区间中满足binary_pred谓词判断的邻近元素对。
template<class ForwardIter, class BinaryPredicate>
ForwardIter adjacent_find(ForwardIter first, ForwardIter last,BinaryPredicate binary_pred)
{if (first==last)return last;ForwardIter next=first;while(++next!=last){if (binary_pred(*first,*next))//两个邻近元素是否满足binary_pred条件return first;first=next;}return last;
}
//实例
#include <algorithm>
#include <list>
#include <iostream>bool parity_equal(int x, int y){return (x-y)%2 == 0 ? 1:0;
}int main(void){using namespace std; //链表初始化list<int> l;l.push_back(3);l.push_back(6);l.push_back(9);l.push_back(11);l.push_back(11);l.push_back(18);l.push_back(20);l.push_back(20);//查找邻接相等的元素list<int>::iterator iResult=adjacent_find(l.begin(),l.end());if(iResult != l.end()){cout << "发现链表有两个邻接的元素相等:" << endl;cout << *iResult << endl;iResult++;cout << *iResult << endl;}//查找奇偶性相同的邻接元素iResult=adjacent_find(l.begin(), l.end(), parity_equal);if(iResult != l.end()){cout << "发现有两个邻接元素的奇偶性相同: " << endl;cout << *iResult << endl;iResult++;cout << *iResult << endl;}system("pause");return 0;
}


范围查找容器元素find_first_of

find_first_of算法用于查找位于某个范围之内的元素,它有如下两个原型,均在迭代器区间[first1,last1)上查找元素*i,使得迭代器区间[first2,last2)有某个元素*j,满足*i==*j或满足二元谓词判断comp(*i,*j)==true的条件。元素找到返回迭代器i,否则返回末位置last1。

template <class ForwardIterator1, class ForwardIterator2>ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1,template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>ForwardIterator1 find_first_of (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2,BinaryPredicate pred);
//find_first_of算法函数的代码
template<class InputIterator, class ForwardIterator>InputIterator find_first_of ( InputIterator first1, InputIterator last1,ForwardIterator first2, ForwardIterator last2)
{while (first1!=last1) {for (ForwardIterator it=first2; it!=last2; ++it) {if (*it==*first1)          // or: if (pred(*it,*first)) for version (2)return first1;}++first1;}return last1;
}            
//实例
#include <algorithm>
#include <iostream>int main(void)
{using namespace std;//定义两个字符串char* string1="abcdef7ghijklmn";char* string2="zyx3pr7ys";//范围查找string1于string2中char* result=find_first_of(string1, string1 +             strlen(string1),string2, string2 + strlen(string2));cout << "字符串string1的第一个出现在string2的字符为:"<< *result << endl;  return 0;
}           


未完待续……

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

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

  1. stl非变易算法(二)

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

  2. stl变易算法(一)

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

  3. stl变易算法(三)

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

  4. stl变易算法(二)

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

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

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

  6. 5. STL容器和算法使用

    STL Standard Template Library,标准模板库 六大组件 容器:存放数据 算法:操作数据 迭代器:算法通过迭代器操作容器数据 仿函数:为算法提供更多的策略 适配器:为算法提供更 ...

  7. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

  8. Java 理论与实践: 非阻塞算法简介

    在不只一个线程访问一个互斥的变量时,所有线程都必须使用同步,否则就可能会发生一些非常糟糕的事情.Java 语言中主要的同步手段就是 synchronized 关键字(也称为内在锁),它强制实行互斥,确 ...

  9. Data Structures with C++ Using STL Chapter 3算法概述---笔记

    <Data Structures with C++ Using STL Chapter 3算法概述---笔记>,作者:茉莉花茶,原文链接:http://www.cnblogs.com/yc ...

最新文章

  1. svn中的ignore
  2. 做一个python的旅游系统_有了它,妈妈再也不担心我感冒了,Python使用迭代器进行天气预报...
  3. 创建XNA Shooter游戏——挑战:用引擎编写自己的游戏
  4. SpringBatch读文件(FlatFileItemReader)写据库(MyBatisBatchItemWriter)(四)
  5. Jquery ajax 学习笔记
  6. how to get context node reference CN0X from view controller reference
  7. 分部方法 partial
  8. S3C2440_MMU
  9. 在腾讯做嵌入式是怎么样的
  10. python 函数修饰符作用是什么_python函数修饰符@的使用
  11. 计算机应用bsp什么意思,bsp文件是什么?bsp文件怎么打开?
  12. win10远程计算机证书错误,设置win10系统ie证书错误的详细办法
  13. BF(暴力求解算法)
  14. 【自动控制原理】知识点
  15. vue-element日期选择器(默认显示当前年月日,并且只能选择当前及当前之前的日期)
  16. python怎么用比图的方式判断菜单是灰色的还是黑色的,彩图对比
  17. win10 Telnet服务器 解决telnet正在连接127.0.0.1...无法打开到主机的连接 在端口 23: 连接失败
  18. PROE技巧【显示隐含的对象】【隐藏坐标】
  19. 基于JavaWeb的校友录同学录管理系统
  20. 【校招VIP】产品行测能力之数图问题

热门文章

  1. HDU 6185 2017广西邀请赛:Covering(矩阵快速幂)
  2. HDU 5933 2016CCPC杭州 A: ArcSoft's Office Rearrangement
  3. 最近邻插值算法 python实现
  4. 高斯滤波详解 python实现高斯滤波
  5. python代码风格
  6. Echarts数据可视化series-line线图,开发全解+完美注释
  7. ResNet网络简单理解与代码
  8. 银行招聘考试面试心得
  9. xilinx官方教程ug871利用HLS实现RealFFT
  10. HTML基础【1】:认识 HTML