第一章:引子

STL包含的算法头文件有三个:<algorithm><numeric><functional>,其中最大最常用的是<algorithm>,今天学习的是<algorithm>包含的算法中的第一部分:非修改顺序操作算法。

接下来学习的算法基于C++11标准,较老的IDE会支持不全面或者部分算法不支持。

第二章:原型解析

如分类名称体现的信息,本节的所有函数都不会修改序列,并且原理上都是顺序遍历迭代器实现的。

all_of

函数原型:
template <class InputIterator, class UnaryPredicate>
 bool all_of (InputIterator first, InputIterator last, UnaryPredicate pred);
函数作用:
比较迭代器区间的元素是否都满足pred的条件,就像名字一样,全部满足就返回true,否则返回false。
函数使用:
前闭后开区间[first,last),first和last为指向同一个容器对象的有效迭代器。
pred应当是一个单参且返回值为bool类型的函数,参数类型和迭代器的实例化类型一致。
使用示例:
bool foobool(int a)
{
if(10 == a)
return true;
return false;
}
void test_all_of()
{
bool bret = false;
vector<int>::iterator itor1;
vector<int>::iterator itor2;
vector<int> ivec(10, 10);
itor1 = ivec.begin();
itor2 = ivec.end();
bret = all_of(itor1, itor2, foobool);
if(bret)
cout << "all_of return true" << endl;
}
any_of
函数原型:
template <class InputIterator, class UnaryPredicate>
 bool any_of (InputIterator first, InputIterator last, UnaryPredicate pred);
函数作用:
和all_of联系起来使用,如果有任何一个迭代器区间的元素满足要求就返回true,否则返回false。
none_of
函数原型:
template <class InputIterator, class UnaryPredicate>
 bool none_of (InputIterator first, InputIterator last, UnaryPredicate pred);
函数作用:
和all_of、any_of联系起来使用,如果区间所有的元素都不满足pred的条件,就返回true,否则false。
for_each
函数原型:
template <class InputIterator, class Function>
  Function for_each (InputIterator first, InputIterator last, Function fn);
函数作用:
对迭代区间的每一个元素都应用函数fn。
函数使用:
前闭后开区间[first,last),first和last为指向同一个容器对象的有效迭代器。
fun为接收单个参数的函数,返回值不限定,参数类型与迭代器实例类型保持一致。
find
函数原型:
template <class InputIterator, class T>
  InputIterator find (InputIterator first, InputIterator last, const T& val);
函数作用:
迭代器区间[first,last)如果找到指定的元素就返回指向元素的迭代器,否则返回last。
函数使用:
前闭后开区间[first,last),first和last为指向同一个容器对象的有效迭代器。
find_if
函数原型:
template <class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
函数作用:
迭代器区间[first,last),如果存在满足pred条件的元素就返回指向该元素的迭代器,否则返回last
函数使用:
前闭后开区间[first,last),first和last为指向同一个容器对象的有效迭代器。
pred应当是一个单参且返回值为bool类型的函数,参数类型和迭代器的实例化类型一致。
find_if_not
函数原型:
template <class InputIterator, class UnaryPredicate>
  InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
函数作用:
迭代器区间[first,last),如果存在不满足pred条件的元素就返回指向该元素的迭代器,否则返回last。
函数使用:
同find_if
find_end
函数原型:
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);
函数作用:
如果第二组迭代器指向的元素被包含在第一组迭代器中,则返回第一组迭代器中最后一个包含的开始位置,否则返回last1.
好拗口啊,看函数示例好理解一些。
函数有两个重载版本,分别用==和pred进行相等判断。
函数使用:
void test_find_end()
{
int array1[] = {1, 2, 3, 4, 5, 1, 2, 3};
int array2[] = {1, 2, 3};
int* ret = NULL;
ret = find_end(array1, array1+8, array2, array2+3);
if(ret != array1+8)
cout << "find array2 last contained in array1, position is " << ret - array1 << endl;
}
find_first_of
函数原型:
template <class InputIterator, class ForwardIterator>
  ForwardIterator1 find_first_of (InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2);
template <class InputIterator, class ForwardIterator, class BinaryPredicate>
  ForwardIterator1 find_first_of (InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2,BinaryPredicate pred);
函数作用:
和find_end很类似的作用,返回第二个迭代器区间第一处被包含在第一个迭代器区间的开始位置,成功则返回不等于last1的迭代器,否则返回last1.
adjacent_find
函数原型:
template <class ForwardIterator>
  ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
  ForwardIterator adjacent_find (ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
函数作用:
查找迭代器区间两个相邻的相等元素,并返回指向第一个相邻元素的迭代器,否则返回last。
count
函数原型:
template <class InputIterator, class T>
 typename iterator_traits<InputIterator>::difference_type
   count (InputIterator first, InputIterator last, const T& val);
函数作用:
返回迭代器区间值等于val的元素的数量。
count_if
函数原型:
template <class InputIterator, class Predicate>
 typename iterator_traits<InputIterator>::difference_type
   count_if (InputIterator first, InputIterator last, UnaryPredicate pred);
函数作用:
返回迭代器区间令pred返回true的元素的数量
mismatch
函数原型:
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);
函数作用:
比较[first1,last1)区间的元素与first2指向的元素,并返回第一处差异的元素pair,是否一致的判定为pred或==,总感觉这个函数存在缺陷,我该如何界定first2何时结束?会不会访问越界,搞清楚之前不使用这个函数。
equal
函数原型:
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);
函数作用:
比较[first1,last1)区间的元素是否全部==(或满足pred)first2指向的区间,同样认为是一个危险的函数,first2的区间长度需要调用者确保是大于first1的区间,但危险程度要小于mismatch。
is_permutation
函数原型:
template <class ForwardIterator1, class ForwardIterator2>
  bool is_permutation (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
  bool is_permutation (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, BinaryPredicate pred);
函数作用:
内部调用了mismatch,将之打入冷宫吧。
search
函数原型:
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_n
函数原型:
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的一个分支,第二个迭代器区间替换为count个val元素,其他一样的。
第三张:小结

这部分的算法都支持STL的容器,也不仅支持容器,只要具有和迭代器一样的++、--、==、=、*等的类型,比如普通指针都是支持的。

【STL源码学习】STL算法学习之一的更多相关文章

  1. STL源码剖析:算法

    启 算法,问题之解法也 算法好坏的衡量标准:时间和空间,单位是对数.一次.二次.三次等 算法中处理的数据,输入方式都是左闭又开,类型就迭代器, 如:[first, last) STL中提供了很多算法, ...

  2. STL源码剖析之组件

    本篇文章开始,进行STL源码剖析的一些知识点,后续系列笔记全是参照<STL源码剖析>进行学习记录的 STL在现在的大部分项目中,实用性已经没有Boost库好了,毕竟STL中仅仅提供了一些容 ...

  3. 【STL源码学习】STL算法学习之二

    第一章:前言 学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起. 第二章:明细 copy 函数原型: template <class InputIterator, cla ...

  4. 《STL源码剖析》学习之traits编程

    侯捷老师在<STL源码剖析>中说到:了解traits编程技术,就像获得“芝麻开门”的口诀一样,从此得以一窥STL源码的奥秘.如此一说,其重要性就不言而喻了.      之前已经介绍过迭代器 ...

  5. stl源码学习(版本2.91)--list

    stl源码学习(版本2.91)--list 一,阅读list()构造函数的收获 1,默认构造函数的作用和被调用的时机 struct no{ no(int i){} //no(){ // std::co ...

  6. c++ stl源码剖析学习笔记(一)uninitialized_copy()函数

    template <class InputIterator, class ForwardIterator>inline ForwardIterator uninitialized_copy ...

  7. 【STL源码学习】std::list类的类型别名分析

    有了点模板元编程的traits基础,看STL源码清晰多了,以前看源码的时候总被各种各样的typedef给折腾得看不下去, 将<list>头文件的类继承结构简化如下 #include < ...

  8. STL源码--iterator和traits编程技法

    第一部分 iterator学习 STL iterators定义: 提供一种方法,使之能够依序巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式. 任何iteartor都应该提供5 ...

  9. STL源码剖析 迭代器(iterator)概念与编程技法(三)

    1 STL迭代器原理 1.1  迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型,STL设计的精髓在于,把容器(Containers)和算法(Algorithms)分开,而迭代器(i ...

  10. 《STL源码剖析》相关面试题总结

    原文链接:http://www.cnblogs.com/raichen/p/5817158.html 一.STL简介 STL提供六大组件,彼此可以组合套用: 容器容器就是各种数据结构,我就不多说,看看 ...

随机推荐

  1. window下gvim中文界面改变成英文界面

    中文环境下设置GVIM的界面.菜单.提示为英文语言 修改你的_vimrc,通常为类似C:\Program Files\Vim 加入以下语句至末尾 " set the menu & t ...

  2. 【HDOJ】4317 Unfair Nim

    基本的状态压缩,想明白怎么dp还是挺简单的.显然对n个数字进行状态压缩,dp[i][j]表示第i位状态j表示的位向高位产生了进位. /* 4317 */ #include <iostream&g ...

  3. 转: Linux 技巧:让进程在后台可靠运行的几种方法

    我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败.如何让命令提交后不受本地关闭终端窗口/网络断开 ...

  4. cf 189B - Counting Rhombi

    题目:189B - Counting Rhombi http://codeforces.com/problemset/problem/189/B 题意:给定一个长方形的 矩形,求能在这个矩形里有多少 ...

  5. 中国海洋大学第四届朗讯杯高级组 Cash Cow(模拟)

    题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2721 题意: 给定n个左标,跟那n个坐标 ...

  6. DTD约束文件

    在讲解DTD文件之前,我要说说一份合格的XML应该符合怎么样的规则? 就我总结一下几点,大家看看就好了: 1.一份XML有且仅有一个根元素. 2.XML是严格区分大小写的,<book>元素 ...

  7. poj2014 不带修改区间第k大树

    主席树 又称函数式线段树,又称可持久化线段树……缺点是内存有点儿大…… type node1=record l,r,sum:longint; end; node2=record x,idx:longi ...

  8. UEFI GPT

    其实关于UEFI的几篇文章很早就写下了,只是自己读了一遍感觉很不满意,就决定重写.目的是想用最简单直白的语言把内容写出来,让每个人都能轻松读懂.当然,如果你已经对这些内容有了很深的理解的话,这篇文章除 ...

  9. MySQL索引的查看创建和删除

    1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...

  10. 【转】Effective-Objective-C-读书笔记-Item-4-如何正确定义常量 -- 不错

    原文网址:http://tutuge.me/2015/03/11/Effective-Objective-C-%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0-Item-4-% ...