前面一节我们学习了移除算法 unique() 函数,读者是否还记得它的功能是什么吗?没错,该函数能够移除序列中相邻的重复元素。本节我们将学习一个新的算法,旋转算法——rotate() 函数。"rotate" 意为"旋转",从名称就能看出,这个函数用于对序列进行循环移位操作,就像旋转一个圆盘一样。

起始迭代器指向不同的元素,旋转的本质是区间的移动

rotate() 函数的语法格式如下:

template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt middle, ForwardIt last );

rotate(first, middle, last) 函数的功能是:对区间 [first, last) 中的元素进行循环左移,使得 middle 指向的元素成为新的首元素,其后的元素依次排列,而 first 到 middle 之间的元素则移动到序列的末尾。该函数返回指向原来 first 位置元素的新位置的迭代器。注意,rotate 执行的是真正的元素移动,会改变元素的物理位置。比如我们有一个序列:{1, 2, 3, 4, 5},使用 rotate(v.begin(), v.begin() + 2, v.end()) 处理后序列变为 {3, 4, 5, 1, 2},元素3成为了新的开头。

下面我们通过代码来演示 rotate() 函数的实际应用:

#include<iostream>
#include<vector>
#include<algorithm>
#include<iterator>//移动迭代器 
#include<string>
using namespace std;
/*rotate(first, middle, last) 函数*/
void test() {
     
   vector<char> v{'.','c','o','m','d','o','t','c','p','p'}; 
   /*旋转前*/ 
   cout << "旋转之前:\t";
     for_each(v.begin(), v.end(), [](const char&c){
        cout << c;
    });
    cout << '\n';
    /*开始旋转*/
if(find(v.begin(),v.end(),'d')!=v.end())//必要判断 
{
rotate(v.begin(),find(v.begin(),v.end(),'d'),v.end()) ;//配合find()函数旋转 
}
/*旋转后*/ 
   cout << "旋转之后:\t";
    for_each(v.begin(), v.end(), [](const char&c){
        cout << c;
    });
} 
int main(){
    system("title dotcpp.com");
    test();
    return 0;
}

编译结果如下:

rotate()函数

观察输出我们发现,".comdotcpp"被旋转为"dotcpp.com",序列发生了循环移位,输出完全符合预期。

总结:rotate() 函数提供了一个高效的序列循环移位机制,它能够在 O(n) 时间复杂度内完成元素的旋转操作;同时在蓝桥杯、ACM等算法竞赛上,rotate() 是处理循环数组、字符串变换、数据重组等问题的得力工具,是 STL 算法库中一个实用且性能优异的函数。

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)