rotate(first, middle, last); middleの要素が先頭、middle-1の要素が末尾となるように、 [first,last)の要素の並びを回転させる。
https://cpprefjp.github.io/reference/algorithm/rotate.html
void rotate_test(){ VI A = {1,2,3,4,5,6,7}; // 左に1つシフト。長さ1はないとRE rotate(A.begin(), A.begin()+1, A.end()); debug(A); // => {2, 3, 4, 5, 6, 7, 1} // 6個先 rotate(A.begin(), A.begin()+6, A.end()); debug(A); // => {1, 2, 3, 4, 5, 6, 7} // begin+7個先には何もない。それが先頭に来て、残りが後ろに続く(ギリギリ) rotate(A.begin(), A.begin()+7, A.end()); debug(A); // => {1, 2, 3, 4, 5, 6, 7} // 8個先 さすがにエラー rotate(A.begin(), A.begin()+8, A.end()); debug(A); // error rotate(A.begin(), A.begin()+100, A.end()); debug(A); }
- 第2引数のoffsetにはvectorの長さまでOK. それ以上だとエラー
- 左方向へのシフトであることに注意
右方向シフト
使う問題
- stringもシフトできる
- B-String Shifting
int main(){ // input string s; cin>>s; ll N=s.size(); vector<string> S; rep(i,N){ rotate(s.begin(), s.begin()+1, s.end()); // 1つシフト S.push_back(s); } sort(ALL(S)); p(S[0]); p(S.back()); return 0; }
注意点
- rotateに与えたvectorそのものを書き換える