zoukankan      html  css  js  c++  java
  • 【STL源码学习】STL算法学习之二

    第一章:前言

    学习笔记,记录学习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.

  • 相关阅读:
    C#设计模式之单例模式(Singleton Pattern)
    ASP.NET MVC Route之WebForm路由与源码分析(二)
    ASP.NET MVC Route之WebForm路由与源码分析(一)
    Autofac初探(一)
    Razor基础语法一
    ASP.NET MVC之视图传参到控制器的几种形式
    LINQ to SQL语句(2)Count/Sum/Min/Max/Avg操作符
    LINQ to SQL语句(1)Select查询的九种形式
    学习《深入理解C#》—— 泛型 (第三章3.1---3.2)
    学习《深入理解C#》—— 委托的构成、合并与删除和总结 (第二章1.1---1.4)
  • 原文地址:https://www.cnblogs.com/learn-my-life/p/3761709.html
Copyright © 2011-2022 走看看