暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++高级学习:第二十七节-环移函数

Cpp入门到精通 2024-03-28
185

点击蓝字 关注我们

c++高级学习

第二十七节  环移函数


      环移函数是一种将序列或容器中的元素进行循环移动的操作。我们这节来将以下什么叫环移函数。

首先讲的是rotate函数,rotate 算法可以用来实现循环移动元素的操作。

rotate 函数共有三个参数

首尾参数表示待操作范围的迭代器first和last,中间参数为指定旋转位置的迭代器 middle。调用rotate 后,指定范围内的元素将会进行循环移位,将 middle 位置之前的元素移到 last 位置之后,而将 middle 位置之后的元素移到 first 位置之前。

    #include<iostream>
    using namespace std;
    #include<vector>
    #include<algorithm>
    void print(int x) {
    cout << x << " ";
    }
    int main() {
    vector<int>v1 = { 1,2,3,4,5,6,7 };
    cout << "环移前:";
    for_each(v1.begin(), v1.end(), print);
    rotate(v1.begin(), v1.begin() + 2, v1.end());
    cout << "\n环移后:";
      for_each(v1.begin(), v1.end(), print);
    cout << endl;
    system("pause");
    return 0;
    }

    调用rotate后,[v1.begin(), v1.begin()+2) 中的元素会被移到 [v1.begin()+2, v1.end()) 的末尾,而 [v1.begin()+2, v1.end()) 中的元素会被移到 [v1.begin(), v1.begin()+2) 的前面。因此,v1.begin()+2 位置之前的元素,也就是3之前的元素,将会被移到最后,v1. begin()+2位置之后的元素将会被移到最前面。

      环移前:1 2 3 4 5 6 7
      环移后:3 4 5 6 7 1 2

      rotate_copy 与 rotate 类似,但不会直接在原始容器上修改元素顺序,而是将旋转后的结果复制到另一个容器中。

      它共有四个迭代器参数:

      第一个参数为待操作范围的起始位置,第二个参数为待操作范围中的旋转位置,第三个参数为待操作范围的结束位置,最后一个参数为目标容器的起始位置,旋转后的结果将会复制到这个位置开始的容器中。

        vector<int>v1 = { 1,2,3,4,5,6,7 };
        vector<int>v2(v1.size());
        cout << "环移前:";
        for_each(v1.begin(), v1.end(), print);
        rotate_copy(v1.begin(), v1.begin() + 2, v1.end(),v2.begin());
        cout << "\n环移后:v1容器:";
        for_each(v1.begin(), v1.end(), print);
        cout << "\tv2容器:";
        for_each(v2.begin(), v2.end(), print);

        调用rotate_copy 后,原始范围 [v1.begin(),v1.end()) 中的元素会按照旋转位置v1.begin()+2进行旋转,但不会修改原始容器。旋转后的结果会被复制到目标容器v2.begin()开始的位置,并返回目标容器中旋转后的结果的结束位置迭代器。

          环移前:1 2 3 4 5 6 7
          环移后:v1容器:1 2 3 4 5 6 7 v2容器:3 4 5 6 7 1 2

          list 容器和vector 容器在使用rotate 函数时有些许不同,因为list 是双向链表,而 vector 是基于数组的容器。list 不支持像 vector 那样通过迭代器进行随机访问。因此,你无法像在vector 中那样使用迭代器指定旋转位置。但是我们还是有方法的。比如以下例子:

            list<int>l1 = { 1,2,3,4,5,6,7 };
            cout << "环移前:";
            for_each(l1.begin(), l1.end(), print);
            auto middle = l1.begin();
            advance(middle, 2);
            rotate(l1.begin(), middle , l1.end());
            cout << "\n环移后:";
            for_each(l1.begin(), l1.end(), print);

            在这个例子中,我们先使用advance将迭代器 it 移动到第三个位置,然后再调用rotate 函数进行旋转操作。这个advance函数我们在之前已经学过,读者可以翻阅在下方搜索栏里点击list容器(下)章节回顾。使用advance()这种方式在list 中是有效的,但在性能上可能不如在vector 中直接使用迭代器指定旋转位置那样高效。

            环移函数的相关操作的讲解到此结束,感谢观看!欢迎各位的点赞与关注!您的点赞和关注是我学习更新的动力!如有问题,可下方留言!

            END

            往期推荐

            C++高级学习:第二十六节-反转函数

            C++高级学习:第二十五节-去重函数

            C++高级学习:第二十四节-删除函数

            C++高级学习:第二十三节-填充函数

            分享、在看与点赞,至少我要拥有一个吧

            文章转载自Cpp入门到精通,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论