ホームページ > バックエンド開発 > C++ > 範囲ベースの for() ループは C の std::map でどのように動作しますか?

範囲ベースの for() ループは C の std::map でどのように動作しますか?

Linda Hamilton
リリース: 2024-10-29 03:27:29
オリジナル
1116 人が閲覧しました

 How do Range-Based for() Loops Work with std::map in C  ?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート