四、c++中的算法--变动性算法---旋转

本文详细介绍了C++标准模板库(STL)中的rotate与rotate_copy算法。通过具体示例展示了如何使用这两种算法来改变容器中元素的顺序,并提供了源代码实现,便于读者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

7.旋转

  • rotate(): 将容器中的元素看成一个环,
  • rotate_copy():产出一个旋转后的副本

函数模板为:

//rotate
template<class ForwardIt>
void rotate(ForwardIt first, ForwardIt n_first, ForwardIt last)
{
    ForwardIt next = n_first;
    while (first != next) {
        std::swap(*first++, *next++);
        if (next == last) {//next指向末尾[first,last)右开位置,重新定位
            next = n_first;
        } else if (first == n_first) {
            n_first = next;
        }
    }
}

//rotate_copy
template<class ForwardIt, class OutputIt>
OutputIt rotate_copy(ForwardIt first, ForwardIt n_first,
                           ForwardIt last, OutputIt d_first)
{
    d_first = std::copy(n_first, last, d_first);//复制后半截
    return std::copy(first, n_first, d_first);//将前半截复制到目标位置的后半截,完成旋转
}

例子:

---------------省略----------------
    vector<int> vec1 = {1,2,3,4,5,6};
    vector<int> vec2;
    rotate(vec1.begin(), vec1.begin() + 3, vec1.end());
---------------省略----------------
    rotate_copy(vec1.begin(), vec1.begin() + 3, vec1.end(), back_inserter(vec2));
---------------省略----------------

输出结果为:

vec1: 4   5   6   1   2   3
vec2: 1   2   3   4   5   6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值