Modifying algorithm

接下来说说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 一下。 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值