第十六章 string类和标准模板库(6)算法

(六)算法

STL包含了许多处理容器的非成员函数,它们都使用迭代器来标识要处理的数据区间和结果存放的位置,有些函数还接受一个函数对象参数,用它来处理数据。常见的算法有copy,sort,random_shuffle,find等。算法函数的特点是可以用于不同的容器类型,算法的适应性强,原因就是使用了迭代器(举例来说deque和vector中的元素是可以用==来进行比较的,因为==被重载了,它使用的是迭代器来进行比较)。

1.算法组

分为四种:非修改式序列操作(find()和for_each()就属于这一类),修改式序列操作(transform(),random_shuffle(),copy()属于这一类,可以对原来的数据进行修改),排序和相关操作(如sort()函数),通用数字运算。前三种在头文件algorithm中描述,最后一种在numeric中描述,最后一种是专用于数值数据的(比如数据累积,相邻数据差等的操作,一般vector对象可以用到)。

2.算法的通用特征

按算法的结果放置的位置进行的分类,分为就地算法和复制算法,sort()就是就地算法,因为排序的结果依然存在原来的对象之中,而copy()就是复制算法,结果被转移到输出迭代器之中。对于复制算法,有一个一般的约定,就是返回一个输出迭代器,这个迭代器指向复制的最后一个值的后面一个位置。有些算法有两个版本,就地版本和复制版本,复制版本一般是在后面加一个_copy后缀,用来与就地版本进行区分,copy版本会多一个参数,就是将结果存储的新的位置。

3.STL和string类

string类不属于STL,但是string类有STL的诸多特点,设计时就考虑了STL。比如,string类包含begin,end,rbegin,rend等成员。因此string类可以使用STL算法来进行相应的操作。string类中有一个方法,用来将string对象转换为下一种排列顺序,如果是最后的序列,则返回false,方法为next_permutation()。

4.函数和容器方法

有时候可以选择使用STL方法和STL函数,这里的方法指的是成员函数,通常STL方法是更好的选择,因为它可以自动调整容器的大小,并且会更适合特定的容器。

5.使用STL

使用STL时要尽量减少编写的代码。需要注意的几点:首先,非关联容器map类有一个有趣的特性,就是可以使用键来访问数据,因为键和值的类型不一样,所以可以使用map1[“the”]这种表示方法(如同数组表示法)来访问map的值。


你可能感兴趣的:(第十六章 string类和标准模板库(6)算法)