これまでは、次のように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」を使用することの正確な意味を知りたいです。
このコードは、最新の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つのバージョンとまったく同じタスクを実行します。
次は私のために働いた:
for (auto x: mymap) {
cout << x.first << endl;
}
前の回答に加えて、C++ 17は構造化バインディングを使用した別のアプローチを追加しました。
for (auto& [key, value]: mymap) {
std::cout << key << " => " << value << '\n';
}
ここでキーワード「auto」を使用することの正確な意味を知りたいです
以下を可能にします。
これは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