
点击蓝字 关注我们

第二十七节 环移函数

环移函数是一种将序列或容器中的元素进行循环移动的操作。我们这节来将以下什么叫环移函数。
首先讲的是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++高级学习:第二十三节-填充函数

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




