STL源码之rotate函数结合图和实例分析


今天看 STL 源码看到 rotate() 函数这一块,该函数就是将 [first, middle) 的元素和 [middle, last) 的元素互换。middle 的元素会成为容器的第一个元素。如果有个数字序列 {1, 2, 3, 4, 5, 6, 7},对元素 3 做旋转操作,会形成 {3, 4, 5, 6, 7, 1, 2}。其实这就是我们平时说的左旋转字符串,只不过泛型化了而已。它可以旋转的内容不止字符串,其他迭代器类型都可以。


三种方法的分析: 

算法1(分组交换):(来自网友:雁过无痕)
若a长度大于b,将ab分成a0a1b,交换a0和b,得ba1a0,只需再交换a1 和a0。若a长度小于b,将ab分成ab0b1,交换a和b0,得b0ab1,只需再交换a 和b1。不断将数组划分和交换,直到不能再划分为止。分组过程与求最大公约数很相似。

代码如下:

emplate <class ForwardIterator, class Distance>
// Distance类型仅仅对于random iterator的实现版本有意义,但为了便于上层代码便于调用,所以使用// 了同样的签名。
void __rotate(ForwardIterator first, ForwardIterator middle, ForwardIterator last, Distance*, forward_iterator_tag)
{
    for (ForwardIterator i = middle; ;) {
        // iter_swap用于交换两个iterator所指向的内容。
        // 也可以这样写:swap(*first, *i);
        iter_swap(first, i);
        ++first;
        ++i;
        if (first == middle) {
            // first和i同时到达末尾,元素交换结束,返回。
            if (i == last)
                return;
            // first首先
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值