C++
サイドバイサイドC ++とC ++ 11とC ++ 14とC ++ 17で解決された古典的なC ++の例の比較
サーチ…
コンテナをループする
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();
begin
とend
を同じ型に強制しますが、 end
は増分も参照も解除されません。したがって、範囲ベースのforループは、ペアイテレータ/イテレータで定義されたコンテナに対してのみ機能します。 C ++ 17標準では、実装を次のように変更してこの制約を緩和しています。
auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
// ...
}
ここで、 begin
とend
は、不等式のために比較できる限り、異なる型であることが許されます。これは、より多くのコンテナ、例えば、反復子/センチネルのペアによって定義されるコンテナをループすることを可能にする。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow