サーチ…


コンテナをループする

C ++では、次のようにインデックスを使用してシーケンスコンテナcループすることができます。

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

シンプルではあるが、そのような文章は、間違った比較演算子や間違った索引付け変数のような共通の意味上の誤りがあります。

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

同様の欠点を持つイテレータを使用して、すべてのコンテナに対してループを実行することもできます。

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11では、ループベースの範囲ベースおよびautoキーワードが導入され、コードは次のようになりました。

for(auto& x : c) x = 0;

ここでは唯一のパラメータはコンテナcと現在の値を保持する変数xです。これにより、以前に指摘されたセマンティクスエラーが防止されます。

C ++ 11標準によれば、基本的な実装は次のものと同等です:

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

このような実装では、 auto begin = c.begin(), end = c.end(); beginendを同じ型に強制しますが、 endは増分も参照も解除されません。したがって、範囲ベースのforループは、ペアイテレータ/イテレータで定義されたコンテナに対してのみ機能します。 C ++ 17標準では、実装を次のように変更してこの制約を緩和しています。

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

ここで、 beginendは、不等式のために比較できる限り、異なる型であることが許されます。これは、より多くのコンテナ、例えば、反復子/センチネルのペアによって定義されるコンテナをループすることを可能にする。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow