第一章:前言

学习笔记,记录学习STL算法的一些个人所得,在以后想用的时候可以快速拾起。

第二章:明细

copy

函数原型:
template <class InputIterator, class OutputIterator>
 OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);
函数作用:
将[first,last)区间的元素拷贝至result开头的迭代器区间,并返回赋值以后的result。
copy_n
函数原型:
template <class InputIterator, class Size, class OutputIterator>
 OutputIterator copy_n (InputIterator first, Size n, OutputIterator result);
函数作用:
从first的迭代器位置开始,拷贝n个元素至result开头的迭代器序列,从函数实现来看,该函数未保证一定不越界,调用者要自己判断n的大小。
copy_if
函数原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate>
 OutputIterator copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
函数作用:
将[first,last)区间传入pred,另pred返回true的元素将被拷贝至result开始的迭代器序列。
copy_backward
函数原型:
template <class BidirectionalIterator1, class BidirectionalIterator2>
 BidirectionalIterator2 copy_backward (BidirectionalIterator1 first, BidirectionalIterator1 last,BidirectionalIterator2 result);
函数作用:
打个比方,copy是穿上衣,copy_backward就是穿裤子。
最终返回的result指向result序列的开始,非结束位置。
这个函数是什么意思呢?和copy都有哪些不一样的应用场合?
move
函数原型:
template <class InputIterator, class OutputIterator>
 OutputIterator move (InputIterator first, InputIterator last, OutputIterator result);
函数作用:
像文件mv操作一样,将[first,last)之间的元素拷贝至result开头的迭代器序列。从vs2010的STL源码来看,没有找到对容量进行检测的,调用者需要保证result的空间足够。
move_backward
函数原型:
template <class BidirectionalIterator1, class BidirectionalIterator2>
 BidirectionalIterator2 move_backward (BidirectionalIterator1 first, BidirectionalIterator1 last, BidirectionalIterator2 result);
函数作用:
倒着mv并返回result,此时的result是mv后的元素的迭代器序列开始。调用者保证result的空间。
swap
函数原型:
template <class T> void swap (T& a, T& b)
 noexcept (is_nothrow_move_constructible<T>::value && is_nothrow_move_assignable<T>::value);
template <class T, size_t N> void swap(T (&a)[N], T (&b)[N])
 noexcept (noexcept(swap(*a,*b)));
函数作用:
将a与b互换,或者a的数组和b的数组互换,如果是数组互换,要指定下标并且下标保持一致。
swap_ranges
函数原型:
template <class ForwardIterator1, class ForwardIterator2>
 ForwardIterator2 swap_ranges (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2);
函数作用:
将[first1,last1)区间的元素与first2开始的区间的元素进行互换,调用者要保证first2的元素足够多。
iter_swap
函数原型:
template <class ForwardIterator1, class ForwardIterator2>
 void iter_swap (ForwardIterator1 a, ForwardIterator2 b);
函数作用:
适用于指针或迭代器,交换的是指向的元素,即*a和*b。
transform
函数原型:
template <class InputIterator, class OutputIterator, class UnaryOperation>
 OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperation op);
template <class InputIterator1, class InputIterator2, class OutputIterator, class BinaryOperation>
 OutputIterator transform (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);
函数作用:
第一种实现,将[first1,last1)区间的元素传给op函数进行处理,将op函数返回值记录在result开头的迭代器序列中,返回的result是迭代器序列的end。
第二种实现,将[first1,last1)区间和first2开头的区间的元素传递给binary_op(*first1++,*first2++),binary_op函数的返回值记录在result开头的迭代器序列中,返回的result是迭代器序列的end。
如上两者都是对迭代器序列进行op处理,处理之后的元素保存在result中,就是转换。
replace
函数原型:
template <class ForwardIterator, class T>
 void replace (ForwardIterator first, ForwardIterator last, const T& old_value, const T& new_value);
函数作用:
将迭代器区间内元素值等于old_value的重新赋值为new_value。
replace_if
函数原型:
template <class ForwardIterator, class UnaryPredicate, class T>
 void replace_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred, const T& new_value );
函数作用:
和replace联系起来就很好理解了,将迭代器区间元素的值传入pred,另pred返回ture的元素将被赋值为new_value。
replace_copy
函数原型:
template <class InputIterator, class OutputIterator, class T>
 OutputIterator replace_copy (InputIterator first, InputIterator last, OutputIterator result, const T& old_value, const T& new_value);
函数作用:
拿一起理解容易混淆,将作用分开理解的话会好一些
第一个作用:将[first,last)区间的元素拷贝至result开头的迭代器区间。
第二个作用:对result开头的迭代器区间执行replace。
返回值的result是拷贝区间的end。
replace_copy_if
函数原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate, class T>
 OutputIterator replace_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred, const T& new_value);
函数作用:
和replace_copy结合起来理解,第一个作用是一样的,第二个作用是对result开头的迭代器区间执行replace_if。
返回值的result是拷贝区间的end。
fill
函数原型:
template <class ForwardIterator, class T>
 void fill (ForwardIterator first, ForwardIterator last, const T& val);
函数作用:
太好理解了,遍历&赋值
fill_n
函数原型:
template <class OutputIterator, class Size, class T>
 OutputIterator fill_n (OutputIterator first, Size n, const T& val);
函数作用:
遍历n个元素进行赋值,调用者保证first的size足够。
generate
函数原型:
template <class ForwardIterator, class Generator>
 void generate (ForwardIterator first, ForwardIterator last, Generator gen);
函数作用:
类似fill函数,将区间的元素赋值为gen的返回值,gen为无参函数。
generate_n
函数原型:
template <class OutputIterator, class Size, class Generator>
 OutputIterator generate_n (OutputIterator first, Size n, Generator gen);
函数作用:
类似于fill_n,赋值n个元素为gen的返回值,gen为无参函数。
remove
函数原型:
template <class ForwardIterator, class T>
 ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);
函数作用:
将迭代器区间值等于val的元素删除掉,并返回迭代器区间的new end。
remove_if
函数原型:
template <class ForwardIterator, class UnaryPredicate>
 ForwardIterator remove_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred);
函数作用:
类似remove,令pred(*first++)返回true的元素将被删掉,并返回迭代器区间的new end。
remove_copy
函数原型:
template <class InputIterator, class OutputIterator, class T>
 OutputIterator remove_copy (InputIterator first, InputIterator last, OutputIterator result, const T& val);
函数作用:
将[first,last)区间值不等于val的元素拷贝至result开头的迭代器区间,并返回result迭代器区间的new end。
remove_copy_if
函数原型:
template <class InputIterator, class OutputIterator, class UnaryPredicate>
 OutputIterator remove_copy_if (InputIterator first, InputIterator last, OutputIterator result, UnaryPredicate pred);
函数作用:
和remove_copy结合理解,所有令pred(*first++)返回值不等于true的将被拷贝至result开头的迭代器区间,返回值是result开头的迭代器区间的new end。
unique
函数原型:
template <class ForwardIterator>
 ForwardIterator unique (ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
 ForwardIterator unique (ForwardIterator first, ForwardIterator last, BinaryPredicate pred);
函数作用:
将迭代器序列中相邻的重复元素删除掉(重复的元素只留下一个),第二个重载就是将pred(*first,*first++)返回true的元素删除掉,返回值是迭代器序列的new end。

把函数名称理解成去相邻重复更好。

unique_copy
函数原型:
template <class InputIterator, class OutputIterator>
 OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result);
template <class InputIterator, class OutputIterator, class BinaryPredicate>
 OutputIterator unique_copy (InputIterator first, InputIterator last, OutputIterator result, BinaryPredicate pred);
函数作用:
将[first,last)序列中相邻的非重复元素(相邻不相等或pred(*first,*first++)返回false)拷贝至result开头的迭代器区间,返回result开头的迭代器区间的new end。
reverse
函数原型:
emplate <class BidirectionalIterator>
 void reverse (BidirectionalIterator first, BidirectionalIterator last);
函数作用:
将迭代器区间的元素倒置。
reverse_copy
函数原型:
template <class BidirectionalIterator, class OutputIterator>
 OutputIterator reverse_copy (BidirectionalIterator first, BidirectionalIterator last, OutputIterator result);
函数作用:
将[first,last)区间的元素倒序复制到result开头的区间,函数返回result开头的迭代器区间的new end。
rotate
函数原型:
template <class ForwardIterator>
 ForwardIterator rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last);
函数作用:
说是旋转,其实不然,就是将middle以及后面的元素拷贝至开头,原本在前面的元素拷贝至最后。
123456789   middle设置为4,翻转后结果是456789123.
rotate_copy
函数原型:
template <class ForwardIterator, class OutputIterator>
 OutputIterator rotate_copy (ForwardIterator first, ForwardIterator middle, ForwardIterator last, OutputIterator result);
函数作用:
1. 拷贝middle-last之间的元素至result
2. 拷贝first-middle之间的元素只result
返回值是result区间的new end。
random_shuffle
函数原型:
template <class RandomAccessIterator>
 void random_shuffle (RandomAccessIterator first, RandomAccessIterator last);
template <class RandomAccessIterator, class RandomNumberGenerator>
 void random_shuffle (RandomAccessIterator first, RandomAccessIterator last, RandomNumberGenerator&& gen);
函数作用:
重新排列迭代器区间的元素。第二个重载版本用gen作为随机的规则。
shuffle
函数原型:
template <class RandomAccessIterator, class URNG>
 void shuffle (RandomAccessIterator first, RandomAccessIterator last, URNG&& g);
函数作用:
随机重新排列迭代器区间的元素,但是比较复杂,用到了random中的生成器,如果没要求的话,用random_shuffle的第一个重载版本就可以。

第三章:畅想

C++11中新增的STL算法函数并不是必不可少的,也不是超级复杂需要极高水平才能实现的,也没有对系统进行封装提炼的,因为C++的基本功能已经很完善了,甚至说超级复杂了,C++11着眼于提高程序员的开发效率,提供程序员可重用的轮子,事实上这里的大多数函数都可以用10行以内的代码实现一个非模板函数的版本,C++11的这种转变是一种令人欣喜的改变,但愿更多C++coder能掌握C++11.

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

  1. STL源码剖析:算法

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

  2. STL源码剖析之组件

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Android在java代码中设置margin

    我们平常可以直接在xml里设置margin,如: <ImageView android:layout_margin="5dip" android:src="@dra ...

  2. Android 签名(1)为什么要签名

    所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 签名可以: 1,用特权,2完整性鉴别,3安全保证, 1,专用权限或特权要签名 一些特权要经签名才允许.签名可用:S ...

  3. 【HDOJ】4043 FXTZ II

    1. 题目描述有n个球,第i个球的伤害值为$2^i-1, i \in [1,n]$.有甲乙两个人,每次由甲选择n个球中的一个,用它以相同概率攻击自己或者乙,同时彻底消耗这个球.这样的攻击最多进行n次. ...

  4. Android开发之实用小知识点汇总-2

    1.EditText 中将光标移到文字末尾: EditText mEdit = (EditText)this.findViewById(R.id.EditText01); mEdit .setText ...

  5. Android-xUtils框架介绍(二)

    昨天对xUtils整体上做了一个简单的介绍,今天咱们就代码码起,真刀实枪的也看看,看看如何快速便捷的把xUtils给集成到大家的项目中去.xUtils中有四大组件可以供我们使用,分别是ViewUtil ...

  6. HTML5学习(五)----SVG

    参考教程地址:http://www.w3school.com.cn/html5/html_5_svg.asp HTML5 支持内联 SVG. 什么是SVG? SVG 指可伸缩矢量图形 (Scalabl ...

  7. 几种java通信(rmi,http,hessian,webservice)协议性能比较

    一.综述 本文比较了RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能.RMI是java语言本身提供的通讯协议 ...

  8. 不能设置sublime text 2 为默认编辑器

    今天遇到一个有趣的事情,当我设置 css 样式表的默认打开方式的时候,却始终无法设置成功,系统总是随机选取一种打开方式来打开文件.比如:pdf.DW.txt等方式. 我设置默认打开方式的步骤如下: 1 ...

  9. bzoj1453

    这是一道好题,按行建线段树,每个点维护上下边界的连通性,详细见代码注释 网上写法不一,自认为比较简单,就放出来相出来献丑吧 ..,..] of longint; //u[]上边界,d[]下边界 s,f ...

  10. 手机3D游戏开发:自定义Joystick的相关设置和脚本源码

    Joystick在手游开发中非常常见,也就是在手机屏幕上的虚拟操纵杆,但是Unity3D自带的Joystick贴图比较原始,所以经常有使用自定义贴图的需求. 下面就来演示一下如何实现自定义JoySti ...