GeezerVison is showing cpprefjp.github.io — std::ranges::shift_left - cpprefjp C++日本語リファレンス
最終更新日時:
2026年09月11日 13時06分31秒 (JST)
Akira Takahashi
が更新
履歴
編集
function template
<algorithm>
std::ranges:: shift_left (C++23)
namespace std :: ranges {
template < permutable I ,
sentinel_for < I > S >
constexpr subrange < I >
shift_left ( I first ,
S last ,
iter_difference_t < I > n ); // (1) C++23
template < forward_range R >
requires permutable < iterator_t < R >>
constexpr borrowed_subrange_t < R >
shift_left ( R && r ,
range_difference_t < R > n ); // (2) C++23
template < execution-policy Ep ,
random_access_iterator I ,
sized_sentinel_for < I > S >
requires permutable < I >
subrange < I >
shift_left ( Ep && exec ,
I first ,
S last ,
iter_difference_t < I > n ); // (3) C++26
template < execution-policy Ep ,
sized-random-access-range R >
requires permutable < iterator_t < R >>
borrowed_subrange_t < R >
shift_left ( Ep && exec ,
R && r ,
range_difference_t < R > n ); // (4) C++26
}
概要
範囲の要素をn個だけ左にシフトさせる。
(1): イテレータ範囲を指定する
(2): Rangeを直接指定する
(3): (1)の並列アルゴリズム版。実行ポリシーを指定する
(4): (2)の並列アルゴリズム版。実行ポリシーを指定する
この関数に符号付き整数型のシフト数として、0および負数を指定した場合はなにもしない。
この関数によって要素をn個だけ左にシフトすると、[first + n, last)の範囲は、ムーブされたあとの「使用してはいけないオブジェクト」となる。その範囲には、循環バッファ (circular buffer) のように新たな要素を代入するか、コンテナのerase()メンバ関数を使用して使わなくなった範囲を削除するなどの対応が必要になる。
事前条件
n >= 0
効果
n == 0である場合、なにもしない
n >= last - firstである場合、なにもしない
i < (last - first) - nである非負の各iについて、first + n + i位置の要素をfirst + i位置にムーブする
(1)では、i = 0からi = (last - first) - n - 1の順に処理する
戻り値
new_lastを次のように定義する。
n < last - firstである場合、first + (last - first - n)
そうでなければ、first
このとき、 {first, new_last}
計算量
最大で(last - first) - n回の代入を行う
備考
シフト数として負数を指定することはできないが、この関数には符号付き整数型を指定することとなっている。これは、Bidirectional Iterator向けの最適化した実装をする場合にstd::prev() 関数を使用するため、そちらのパラメータ型と合わせたことによる
shift_left()とshift_right() で関数が分かれているのは、コンパイルしたコードサイズを小さくするためと、左シフトと右シフトでは最大パフォーマンスのための実装が異なるためである
例
基本的な使い方
出力
3,4,5,4,5,
並列アルゴリズムの例 (C++26)
出力
3 4 5
バージョン
言語
処理系
参照