std::map での範囲ベースの for() ループの使用
C 11 以降の範囲ベースの for() ループは次のようになります。コンテナを反復処理する便利な方法です。例ではベクトルのような単純なコンテナがよく示されますが、マップなどのより複雑なデータ構造でコンテナを使用すると混乱が生じます。
マップで範囲ベースの for() ループを使用する場合、要素の型はそれほど単純ではありません。どうやらそうです。次の例を考えてみましょう。
<code class="cpp">std::map<foo, bar> testing = { /*...blah...*/ }; for (auto abc : testing) { std::cout << abc << std::endl; // ? should this give a foo? a bar? std::cout << abc->first << std::endl; // ? or is abc an iterator? }</code>
ループ変数がコンテナの要素の型 (int など) であるベクトルとは異なり、マップのループ変数 abc は実際には std::pair< 型です。 ;const foo, bar>。これは、abc がマップのキーと値の両方を含むペアを保持していることを意味します。
C 17 以降では、構造化バインディングを使用してキーと値に直接アクセスできます:
<code class="cpp">for (auto& [key, value] : myMap) { std::cout << key << " has value " << value << std::endl; }</code>
C 11 および C 14 では、拡張された for ループを使用してマップを反復処理できますが、キーと値を手動で抽出する必要があります。
<code class="cpp">for (const auto& kv : myMap) { std::cout << kv.first << " has value " << kv.second << std::endl; }</code>
ループ変数 abc またはこれらの例の kv はイテレータではありません。代わりに、現在のマップ要素のキーと値を含むペアのコピーを表します。この区別は、ループ内のマップ要素への変更または参照を考慮するときに重要です。
以上が範囲ベースの for() ループは C の std::map でどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。