44

これまで、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」を使用することの正確な意味を知りたいと思います。

4

6 に答える 6

49

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

これだけを使用すると、次のautoように書くことができます(ベンに感謝)

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つのバージョンとまったく同じタスクを実行します。

于 2013-01-28T05:07:40.537 に答える
26

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

for (auto& [key, value]: mymap) {
        std::cout << key << " => " << value << '\n';
} 
于 2017-07-23T18:34:35.077 に答える
16

以下は私のために働いた:

for (auto x: mymap) {
  cout << x.first << endl;
}
于 2013-12-31T16:28:27.847 に答える
4

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

それは可能にします:

  • 典型的な反復コードの入力が少ない
  • コンパイラがイテレータの正確なタイプを推測するため、手動エラーの可能性が低くなります。
于 2013-01-28T05:10:23.697 に答える
3

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

for ( decl : coll ) {
    statement
}

自動:自動による自動型控除

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

auto i = 42; // i has type int
double f();
auto d = f(); // d has type double
于 2013-01-28T05:09:06.263 に答える
0
for (auto& x: mymap) {
        std::cout << x.first << " => " << x.second << '\n';
}  

このコードでは、基本的に2つのものが使用されています-

最初-自動キーワード:

autoキーワードは、宣言されている変数のタイプが初期化子から自動的に差し引かれることを指定します。

作業する変数のタイプがわからない場合はautoキーワードを使用でき、マップ上で反復するために使用できます。自動変数を使用してリストするか、存在する要素のタイプがわからないイテレーターを使用できます。マップ内、リストなど。

2番目-範囲ベースのループ-「範囲ベースのfor」と呼ばれるこの形式のforループは、コードで指定されたマップ内の各要素を反復処理します。

したがって、コードでは-autoを使用して要素の値のタイプがわからなかったマップを反復処理しています。ここでは、範囲ベースのループを使用しているため、提供されたマップのサイズを知る必要はありません。マップに存在する各要素を繰り返し処理します。

于 2021-09-06T08:38:21.650 に答える