rotate

发布时间:2025-12-13 18:31:49
贴主:badb0ttle
热度:1

badb0ttle 18:32

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,但是没看懂(太菜了)^_^


(0)

Copyright 2016 - 2025 XUJC ACM Team
闽ICP备2020022076号-1