CXX.ITER.END.BEGIN

範囲の終わりを表す反復子が範囲の始まりの前にあります

コンテナーの要素で反復する場合、使用される反復子は有効な範囲で反復する必要があります。反復子の範囲は、範囲の最初の要素と最後の要素をそれぞれ参照する反復子のペアです。範囲の始まりを表す反復子は、範囲の終わりを表す反復子より前にある必要があります。

軽減と防止

範囲の始まりと終わりを表す反復子が、正しい順序になっていることを確認してください。

脆弱コード例

コピー
void f(const std::vector<int> &c) {
        std::for_each(c.end(), c.begin(), [](int i) { std::cout << i; });
}

上記のコードでは、2 つの反復子は同じコンテナーをポイントしていますが、begin() 反復子は end() 反復子の前にありません。内側のループのループでは、std::for_each() は、最初の引数として渡された反復子を、2 番目の引数として渡された反復子と比較しています。2 つの反復子が同一でない限り、最初に渡された反復子を増やし続けます。ただし、上記のコードでは、最初に渡された反復子が end() 反復子である場合、それを増やすと、ベクトルの範囲を超えてしまい、未定義の動作が発生します。