ホームページ > バックエンド開発 > C++ > 範囲ベースの反復は C の標準マップでどのように機能しますか?また、バージョン間で構文はどのように異なりますか?

範囲ベースの反復は C の標準マップでどのように機能しますか?また、バージョン間で構文はどのように異なりますか?

Mary-Kate Olsen
リリース: 2024-10-30 02:49:28
オリジナル
1078 人が閲覧しました

How does range-based iteration work with standard maps in C   and how does the syntax differ across versions?

標準マップの範囲ベースの反復

C 11 以降では、範囲ベースの for() ループにより反復に便利な構文が提供されます。コンテナを通して。ただし、マップのような複雑なデータ構造での動作は混乱を招く可能性があります。

次の例を考えてみましょう:

<code class="cpp">std::map<foo, bar> testing = /*...initialized...*/;
for (auto abc : testing) {
  std::cout << abc << std::endl;
}</code>
ログイン後にコピー

このループ内の abc の型は何ですか? foo キー、bar 値、または反復子を生成しますか?

解決策

C 11 および C 14 では、範囲ベースのループがマップのキーを反復処理します。 -値のペア。したがって、abc のタイプは std::pair になります。これは、各要素が個別のキーや値ではなく、キーと値のペアを表すことを意味します。

キーと値を個別に取得するには、ペアの最初と 2 番目のメンバーを使用できます。

<code class="cpp">for (auto abc : testing) {
  std::cout << abc.first << " has value " << abc.second << std::endl;
}</code>
ログイン後にコピー

ループ内の変数は通常、マップの内容を変更しないことを示すために const として宣言されることに注意してください。

C 17 以降

In C 17 では、マップの範囲ベースの反復に便利な省略記法が導入されています。

<code class="cpp">for (const auto& [key, value] : testing) {
  std::cout << key << " has value " << value << std::endl;
}</code>
ログイン後にコピー

この構文は、最初と 2 番目のメンバーをキーと値で直接置き換えます。これにより、キーと値のペアに対する繰り返しのより明確で簡潔な表現が可能になります。

追加の考慮事項

  • ループ内でマップのコンテンツを変更することが可能です。 auto&:
<code class="cpp">for (auto& kv : testing) {
  std::cout << kv.first << " had value " << kv.second << std::endl;
  kv.second = "modified";  // Modifies the map's value
}</code>
ログイン後にコピー
  • として宣言された参照変数を使用する マップの値が大きい場合は、ペア オブジェクトの代わりに反復子を含む範囲ベースのループを使用する方が効率的である可能性があります。ただし、これにより、範囲ベースの for ループによって提供される利便性の一部が失われます。

以上が範囲ベースの反復は C の標準マップでどのように機能しますか?また、バージョン間で構文はどのように異なりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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