rotate(旋转)
前言
首先想学SAM的可以退出去了,这篇不会讲(想学自己去开拓叭)这里主要将一些偷懒但没什么用的小技巧函数。其实很早就看到这个函数了,但是当时看到说是偷懒用的就没注意了。现在记起来就赶紧写一个。至于为什么放在A+B,我记得之前有用过但是忘记在哪题了XD,现在在找
1.std::rotate(以及 std::ranges::rotate)
作用:把区间 [st, ed) 旋转,使得 mid 变成新的开头。
复杂度:O(n)
```cpp
string s="123456";
rotate(s.begin(),s.end()-2,s.end());
//s="561234",它的区间变成[s.end()-2,s.end())+[s.begin(),s.end()-2),左闭右开哦
```
ranges::rotate只支持c++20以上,很可惜oj不支持,喜欢打cf的可以用这个,更短(ranges有很多很有用的小技巧,之后可能专门出一篇关于ranges的)
```cpp
string s="123456";
std::ranges::rotate(s, s.end() - 2);
//同上
```
如果觉得写ranges太累,不妨:
using namespace std::ranges;
但是要注意: **别把 std、std::ranges、std::views 全都 using namespace!!!**
views 里有很多短名字(filter, transform, reverse…),很容易和你自己变量/函数名撞。
## 2.std::rotate_copy
和 rotate 一样的旋转逻辑,但不改原区间,把结果写到输出迭代器:
```cpp
string s="123456";
string t(s.size(),' ');
//一定要预留空间!!!
std::rotate_copy(s.begin(), s.end()-2, s.end(), t.begin());
// t == "561234",s 不变
```
我还发现了有rotate.h,但是没看懂(太菜了)^_^