关闭

《C++标准程序库》学习笔记(四)算法

620人阅读 评论(0) 收藏 举报

为了处理容器内的元素,STL提供了一些标准算法,包括搜寻、排序、拷贝、重新排序、修改、数值运算等十分基本而普遍的算法。

算法并非容器类别的成员函数,而是一种搭配迭代器使用的全局函数。

 

区间

所有算法都用来处理一个或多个区间内的元素。

调用者必须确保经由两参数定义出来的区间是有效的(valid)。所谓有效就是:从起点出发,逐一前进,能够到达终点。也就是说,程序员自己必须确保两个迭代器隶属于同一个容器,而且前后放置正确。

所有算法处理的都是半开区间(half-open ranges)——含括起始元素位置但不含括结尾元素位置。传统的数学表示方法为:

[begin, end)

 

处理多个区间

有数个算法可以(或说需要)同时处理多个区间。通常你必须设定第一个区间的起点和终点,至于其它区间,你只需设定起点即可,终点通常可由第一个区间的元素推导出来。

注意:如果某个算法用来处理多个区间,那么当你调用它时,务必确保第二(以及其它)区间所拥有的元素个数,至少和第一个区间内的元素个数相同。

 

算法分类

STL算法可以分为以下几类:

算法

说明

非变动性算法(nomodifying algorithms

既不改动元素次序,也不改动元素值。它们透过input迭代器和forward迭代器完成工作,因此可用于所有标准容器身上。如:for_each()

变动性算法(modifying algorithms

要么直接改变元素值,要么就是在复制到另一区间的过程中改变元素值。如果是第二种情况,原区间不会发生变化。这些算法的目标区间不能是关联式容器。如:for_each()transform()

移除性算法(Removing Algorithms

根据元素值或某一准则,在一个区间内移除某些元素。这些算法并不能改变元素的数量,他们只是在逻辑上将原本置于后面的“不移除元素”向前移动,覆盖那些被移除元素而已。它们都返回新区间的逻辑终点(也就是最后一个“不移除元素”的下一位置)。这些算法的目标区间不能是关联式容器。如:remove()

变序性算法(Mutating Algorithms

改变元素的次序,但不改变元素值。这些算法的目标区间不能是关联式容器。如:reverse()

排序算法(Sorting Algorithms

完全排序、局部排序。如:sort()

已序区间算法(Sorted Range Algorithms

针对已序区间执行的算法,执行前提是源区间必须在某个排序准则下已序(sorted)。如:binary_search()

数值算法(Numeric Algorithms

用于数值处理。运用数值运算之前必须先含入头文件<numeric>

#include <numeric>。如:accumulate()

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:214324次
    • 积分:3018
    • 等级:
    • 排名:第11622名
    • 原创:78篇
    • 转载:40篇
    • 译文:2篇
    • 评论:21条
    最新评论