web-dev-qa-db-ja.com

C ++ STLマップデータ構造を反復処理する:新しい手法ですか? (範囲にわたる反復と「auto」キーワード)

これまでは、次のようにSTLマップ内のすべてのキーを走査するために常にイテレーターを使用していました。

    for (std::map<char,int>::iterator it=mymap.begin(); it!=mymap.end(); ++it){
            std::cout << it->first << "  => " << it->second << '\n';
    }

ごく最近、私は以下に示すようにキーを反復処理するために異なるスタイルを使用するコードに出会いました。この機能は最近改訂された標準でのみ追加されましたか?他の多くの言語がすでに提供しているように、より少ないコードでより多くのことを成し遂げるという、かなり興味深い方法のようです。

    for (auto& x: mymap) {
            std::cout << x.first << " => " << x.second << '\n';
    }  

また、ここでキーワード「auto」を使用することの正確な意味を知りたいです。

27
KT100

このコードは、最新のC++標準(C++ 11)の2つの新機能、 型推論の自動キーワード 、および ループに基づく範囲 を使用します。

autoだけを使用すると、これは(Benに感謝)と書くことができます。

for (auto it=mymap.begin(); it!=mymap.end(); ++it)

これにちょうど範囲を使用すると、次のように記述できます。

for (std::pair<const char,int>& x: mymap) {
        std::cout << x.first << " => " << x.second << '\n';
}  

これらは両方とも、2つのバージョンとまったく同じタスクを実行します。

31
Karthik T

次は私のために働いた:

for (auto x: mymap) {
  cout << x.first << endl;
}
13
mcsilvio

前の回答に加えて、C++ 17は構造化バインディングを使用した別のアプローチを追加しました。

for (auto& [key, value]: mymap) {
        std::cout << key << " => " << value << '\n';
} 
11
BoshWash

ここでキーワード「auto」を使用することの正確な意味を知りたいです

以下を可能にします。

  • 典型的な反復コードの入力が少ない
  • コンパイラがイテレータの正確なタイプを推測するため、手動エラーの可能性が少なくなります。
4
Alok Save

これはC++ 11の新機能であり、Range-Based for Loops。指定された範囲、配列、またはコレクションのすべての要素を反復処理します。他のプログラミング言語ではforeachループと呼ばれます。一般的な構文は次のとおりです。

for ( decl : coll ) {
    statement
}

Auto:autoによる自動型推論

C++ 11では、たとえば次を使用して、特定の型を指定せずに変数またはオブジェクトを宣言できます。

auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
2
billz