web-dev-qa-db-ja.com

unordered_map C ++を繰り返す

私は、 '、'を押すまで入力を読み取るプログラムを作成しました-入力でCOMA。次に、入力した文字の数を数えます。

このマップを繰り返し処理したいのですが、itはタイプなしでは定義できないと表示されています。

#include <iostream>
#include <conio.h>
#include <ctype.h>

#include <iostream>
#include <string>
#include <tr1/unordered_map>
using namespace std;

int main(){
    cout<<"Type '.' when finished typing keys: "<<endl;
    char ch;
    int n = 128;
    std::tr1::unordered_map <char, int> map;


    do{
      ch = _getch();
    cout<<ch;
      if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z'){
            map[ch] = map[ch] + 1;
      }
    } while( ch != '.' );

    cout<<endl;

    for ( auto it = map.begin(); it != map.end(); ++it ) //ERROR HERE
        std::cout << " " << it->first << ":" << it->second;


    return 0;
}
8
Yoda

autoを使用しているため、 C++ 11 コードがあります。 C++ 11準拠のコンパイラー(GCC 4.8.2以降など)が必要です。 Peter G。 がコメントしているので、変数にmapstd::map)という名前を付けないでください。 mymapでは、どうぞ

#include <unordered_map>

tr1は必要ありません!)

次に、g++ -std=c++11 -Wall -g yoursource.cc -o yourprogを使用してコンパイルし、 範囲ベースのforループ をコーディングします

for (auto it : mymap) 
    std::cout << " " << it.first << ":" << it.second << std::endl;
23

C++ 17では、以下のコードのように、より短くてよりスマートなバージョンを使用できます。

unordered_map<string, string> map;
map["hello"] = "world";
map["black"] = "mesa";
map["umbrella"] = "corporation";
for (const auto & [ key, value ] : map) {
    cout << key << ": " << value << endl;
}
19
Dorin Lazăr

auto(およびその他のC++ 11機能)を使用する場合は、-std=c++11をコンパイラフラグ(gcc/icc/clangを使用)に追加します。ところで、unordered_mapはC++ 11のstdにあります... std::isalphaもあります...

4
Walter

DorinLazărの回答に基づくと、別の可能な解決策は次のとおりです。

unordered_map<string, string> my_map;
my_map["asd"] = "123";
my_map["asdasd"] = "123123";
my_map["aaa"] = "bbb";
for (const auto &element : my_map) {
    cout << element.first << ": " << element.second << endl;
}
2
Erik Campobadal