接下来说说STL的第二类算法, Modifying algorithm。
顾名思义, Modifying algorithm 就是能够修改容器中元素的值(value )的算法。 主要有copy 算法, move算法, transform, swap 等等如下图。
如上图, 我们在例子中用到了向量 容器和迭代器。 下面看看各个算法的使用情况:
(1)copy 算法。 下例子中, 将vec的所有元素(由手为迭代器指定)拷贝到vec2 中。 注意vec2 is at least as big as vec, otherwise it is undefined behaviour。这个例子中, vec 的大小为7, vec2 的大小为11, so we are safe.
(2) copy_if 算法。 只有满足条件才会拷贝到目标容器中。 如下图, 使用lambda 函数作为条件, 所以只有两个被拷贝到目标容器的开始位置。
(3)copy_n 函数 copies n elements from one place to another. 下例中复制了4个元素大炮vec2。
(4)copy_backward 是从后向前复制到vec2. 这样vect2 变为如下情况(参见图)
第二个算法move:
如下图中,
对于vector of string,
(1)将vec 的所有元素移动到vec2, 此时vec 容器的内容就是未定义的(尽管通常情况下是empty string。
(2)move_backward 将vec 的所有元素f反向移动到vec2 中。
如果move semmantics 定义在相关的元素类型上(在这里是string), 那么元素就移动到目标容器中。
如果没有定义在相关类型元素上(例如哦、integer), 那么元素就相当于调用了copy constructor 到目标容器中(相当于copy)。
transform算法和swap
对源容器的每个元素transform, 然后将结果保存在另外一个容器中。 如下图。
transform 也可以使用来自两个容器的相关的元素进行transform , 然后将结果保存在另一个容器中。 例如下图中transform的输入 vec 和vec2 是两个容器。
swap : it swap data in 2 places. 例如下例中, 将vec 的数据域vec2 的数据交换了一下。 我们可以将swap 想象成为two-way copy。
Fill 算法:
算法的作用是向容器中添加入某些新的数据。 例如下图中, 用数字9 将容器中的所有元素值设为9.
fill_n: fill n items with certain value。
generate: 用一个函数rand 产生的数据添加
generate_n: 用函数rand 产生的n个数据填充
Replace 算法:
(1)将容器中的所有6 替换为9.
(2)replace_if: 将容器中的所有满足条件的容器替换。
(3)replace_copy: 既做replace, 有做copy . 例如下图中, 将6 替换为9 , 然后将结果保存在vec2 容器中。
remove 算法:下图中
(1)remove试讲vec 容器中的所有的3 移除掉
(2)remove_if: 移除容器中满足条件的元素
(3)remove_copy: 移除相关元素后, 将结果复制到vec2 中保存。
(4)unique: 移除出 连续出现的两个相等的元素
(5)unique: 吃进参数less<int>() 的时候, 移除当 前一个元素比后一个元素小的元素
(6)unique_copy: 将具有唯一元素的结果保存到vec2 中, vec 没有任何改变。
最后我们看看order changing algorithm。
主要有reverse, rotate, permute, shuffle 算法。 这些算法会改变容器中的元素顺序。
下面主要介绍一下各个算法的用途:
(1)reverse: 将容器中的元素reverse一下。
(2)reverse_copy: 先reverse, 然后将结果复制到vec2 中保存下来
(3)Rotate: rotate data from vec.begin() to vec.end() until the data in vec.begin() +3 becomes the first one。
(4)rotat_copy: 先rotate, 然后将结果复制到vec2保存起来。 最终vec 没有任何变化。
permute 算法:
next_permutation: 将容器中的元素按照lexicographically 从小到大的顺序排列
prev_permutation: 将容器中的元素按照lexicographically 从大到小的顺序排列
shuffle 算法:
将数据随机的rearrange 一下。