第一章:引子

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. P78、面试题10:二进制中1的个数

    题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如把9表示成二进制1001,有2位是1.因此如果输入9,该函数输出2. 相关题目: 1)用一条语句判断一个整数是不是2的整数次方.一 ...

  2. Ubuntu 12.04搭建Andorid编译环境

    1.安装JDK,Android 5.0开始,开始使用OpenJDK 1.7,4.4等低版本是Oracke JDK1.6 install java environment // install open ...

  3. WinCE NAND flash - FAL

    http://blog.csdn.net/renpine/article/details/4572347 http://msdn.microsoft.com/en-US/library/ee48203 ...

  4. Nandflash 驱动移植

    前段时间,研究了一下4G的Nandflash驱动.手头上只有飞凌6410BSP自带的Nandflash驱动,该驱动不支持K9GAG08U0D(2G)和K9LBG08U0D(4G)的Nandflash. ...

  5. VS2005工程增加SDK

    客户最近发过来一个VS2005的工程,此工程是基于Pocket PC 2003(ARMV4),需要改为我们WINCE6.0系统对应的SDK,下面具体说明如何添加新的SDK. 选择configurati ...

  6. python web开发遇到socket.error[errno 10013]

    socket.error[errno 10013],端口被占用 重新换一个端口,或者把占用该端口的程序关闭就可以了

  7. Ruby Gem命令

    Gem是一个管理Ruby库和程序的标准包,它通过Ruby Gem(如 http://rubygems.org/ )源来查找.安装.升级和卸载软件包,非常的便捷. Ruby 1.9.2版本默认已安装Ru ...

  8. CPU占用率高分析方法步骤[转载]

    由于涉及到私有代码,所有图片都隐去 1.执行TOP命令,确认CPU占用较高的进程PID 根据top命令,发现PID为8691的Java进程占用CPU高达3858%,出现故障 2.确认该进程中CPU占用 ...

  9. windows2003远程桌面退出后系统自动注销的解决方法

    最近公司有一个奇怪的需求,意思是有一个网页,要时时的打开着.现在只有把这个网页在服务器上打开. 这样才能满足需求.但我在应用中遇见了个问题.我在服务器上打开网页后,关掉远程,过一会网页的运行效果就没有 ...

  10. listview使用总结

    1. android给listview的item设定高度 原文网址:http://blog.csdn.net/l_serein/article/details/7403992 在item的layout ...