web-dev-qa-db-ja.com

C ++マップ値を印刷するにはどうすればよいですか?

次のようなmapがあります。

map<string, pair<string,string> > myMap;

そして、以下を使用して地図にデータを挿入しました。

myMap.insert(make_pair(first_name, make_pair(middle_name, last_name)));

マップ内のすべてのデータを印刷するにはどうすればよいですか?

43
user1422866
for(map<string, pair<string,string> >::const_iterator it = myMap.begin();
    it != myMap.end(); ++it)
{
    std::cout << it->first << " " << it->second.first << " " << it->second.second << "\n";
}

C++ 11では、map<string, pair<string,string> >::const_iteratorを入力する必要はありません。 autoを使用できます

for(auto it = myMap.cbegin(); it != myMap.cend(); ++it)
{
    std::cout << it->first << " " << it->second.first << " " << it->second.second << "\n";
}

cbegin()およびcend()関数の使用に注意してください。

さらに簡単に、範囲ベースのforループを使用できます。

for(auto elem : myMap)
{
   std::cout << elem.first << " " << elem.second.first << " " << elem.second.second << "\n";
}
72
Armen Tsirunyan

コンパイラがC++ 11(の少なくとも一部)をサポートしている場合、次のようなことができます:

for (auto& t : myMap)
    std::cout << t.first << " " 
              << t.second.first << " " 
              << t.second.second << "\n";

C++ 03の場合、代わりにstd::copyを挿入演算子とともに使用します。

typedef std::pair<string, std::pair<string, string> > T;

std::ostream &operator<<(std::ostream &os, T const &t) { 
    return os << t.first << " " << t.second.first << " " << t.second.second;
}

// ...
std:copy(myMap.begin(), myMap.end(), std::ostream_iterator<T>(std::cout, "\n"));
22
Jerry Coffin

C++ 17 から 範囲ベースのforループ構造化バインディング とともに使用して、マップを反復処理することができます。これにより、コード内で必要なfirstおよびsecondメンバーの量が減るため、読みやすさが向上します。

std::map<std::string, std::pair<std::string, std::string>> myMap;
myMap["x"] = { "a", "b" };
myMap["y"] = { "c", "d" };

for (const auto &[k, v] : myMap)
    std::cout << "m[" << k << "] = (" << v.first << ", " << v.second << ") " << std::endl;

出力:

m [x] =(a、b)
m [y] =(c、d)

Coliruのコード

5
honk