第一章:引子

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. Foreman--管理PuppetClient

    一. 环境: 1. server: puppetmaster+activemq+foreman1.3 server1.xxx.com(10.8.1.201) 2. client: fedora 19 ...

  2. Foreman--Puppet类导入

    一.Foreman环境: foreman建好后,系统默认创建了3个环境:production,development,common, 1. production: 在puppet.conf里已经定义其 ...

  3. unite

    列出某个集合里的项目,比如file,buffer等 :United file——列出文件 :United buffer——列出buffer :United file_rec——递归列出文件 进入Uni ...

  4. [ffmpeg 扩展第三方库编译系列] 关于 mingw32 下编译libcaca

    在编译前最好先看一下帮助 ./configure --help 开始编译 ./configure  --disable-shared --disable-cxx \ --disable-csharp ...

  5. 正确认识Android的内存管理机制,合理关闭进程 (一)

    随着大家收货后会有很多乐粉晒内存,为啦方便大家,在网上搜集了一些相关Andriod管理的相关机制合理管理内存,整理下发个贴. 首先要知道Android系统是基于Linux 2.6内核开发的开源操作系统 ...

  6. process thread Fiber(linux)

    http://blog.chinaunix.net/uid-21084809-id-2215376.html Processes, kernel threads, user threads, and ...

  7. C# 中的 ref 和 out 的意义和使用方法

    原文C# 中的 ref 和 out 的意义和使用方法 向方法传递一个实参时,对应的形参会用实参的一个副本来初始化,不管形参是值类型(例如 int),可空类型(int?),还是引用类型,这一点都是成立的 ...

  8. 远程调试hadoop各组件

    远程调试对应用程序开发十分有用.例如,为不能托管开发平台的低端机器开发程序,或在专用的机器上(比如服务不能中断的 Web 服务器)调试程序.其他情况包括:运行在内存小或 CUP 性能低的设备上的 Ja ...

  9. android studio 使用的一些注意,一些报错的解决方法(原创)

    NDK 编译无法通过 注意看 build.gradle 里面的 有些是 ndk-build windows 上用 ndk-build.cmd Summary: gradle calls ndk-bui ...

  10. js基础第八天

    返回前面起第一个字符位置 indexOf("sdfsdf");它是从左边索引为0开始数,而且只找第一个,然后返回该字符的位置.返回是个数值.如果找不到该字符,那么就会返回-1. 返 ...