无法在C++中打印地图值的地图

无法在C++中打印地图值的地图,c++,C++,我尝试了下面的代码片段来打印映射值的映射,但无法访问第二个映射值 #include <iostream> #include <iterator> #include <map> #include <string> using namespace std; int main() { map< string, std::map<std::string, int> > someStorage; //First key value

我尝试了下面的代码片段来打印映射值的映射,但无法访问第二个映射值

#include <iostream>
#include <iterator>
#include <map>
#include <string>
using namespace std;

int main()
{

map< string, std::map<std::string, int> > someStorage;
//First key values
someStorage["key1"]["This Is Layer one"] = 100;
someStorage["Key1"]["This Is Layer Two"] = 120;

//second key, values
someStorage["key2"]["This Is Layer one"] = 110;
someStorage["key2"]["This Is Layer Two"] = 110;
map< string, std::map<std::string, int> > ::iterator itr;
cout << "\nThe map is : \n";
for (itr = someStorage.begin(); itr != someStorage.end(); ++itr) 
{
 cout << '\t' << itr->first;
 //<< '\t' << (itr->second).first << '\n'  <==problematic part
 //<< '\t' << (itr->second).second << '\n';  <==problematic part
 }
 cout << endl;
return 0;
}
如何打印/访问这些值以及如何区分这一层 一个用于键1和键2。因为我可以看到它越来越大了 如果指定key2值,则key1具有相同的值。为什么?

此外,我期待下面的键值对

Key1=>{这是第一层,100} {这是第二层,120}

Key2=>{这是第一层,110} {这是第二层,110}


.

您需要第二个内部循环来遍历嵌套的std::map。像这样:

for (auto itr = someStorage.cbegin(); itr != someStorage.cend(); ++itr) 
{
    cout << itr->first << " => ";

    for (auto innerItr = itr->second.cbegin(); innerItr != itr->second.cend(); ++innerItr) 
    {
       cout << innerItr->first << " : " << innerItr->second << " ";
    }

    cout << "\n";
}

请注意,对于所需的输出,您需要大写键,以便它们是Key1和Key2。这是您当前问题中的一个输入错误。进一步注意,我将begin/end成员函数改为cbegin/cend,因为循环不会修改容器。

您需要第二个内部循环来遍历嵌套的std::map。像这样:

for (auto itr = someStorage.cbegin(); itr != someStorage.cend(); ++itr) 
{
    cout << itr->first << " => ";

    for (auto innerItr = itr->second.cbegin(); innerItr != itr->second.cend(); ++innerItr) 
    {
       cout << innerItr->first << " : " << innerItr->second << " ";
    }

    cout << "\n";
}

请注意,对于所需的输出,您需要大写键,以便它们是Key1和Key2。这是您当前问题中的一个输入错误。进一步注意,我将begin/end成员函数改为cbegin/cend,因为循环不会修改容器。

您还需要迭代内部映射,类似于:

for (auto itr1 = someStorage.begin(); itr1 != someStorage.end(); ++itr1) 
{
    cout << '\t' << itr->first << ":\n";
    for (auto itr2 = itr1->second.begin(); itr2 != itr1->second.end(); ++itr2) 
    {
         cout << "\t\t" << itr2->first << '\n';
         cout << "\t\t" << itr2->second << '\n';
    }
}

您还需要迭代内部映射,例如:

for (auto itr1 = someStorage.begin(); itr1 != someStorage.end(); ++itr1) 
{
    cout << '\t' << itr->first << ":\n";
    for (auto itr2 = itr1->second.begin(); itr2 != itr1->second.end(); ++itr2) 
    {
         cout << "\t\t" << itr2->first << '\n';
         cout << "\t\t" << itr2->second << '\n';
    }
}

除了这里的其他答案外,您还可以使用c++17来简化此问题:

for (auto const& [key, val] : someStorage) { // val = second map
  for (auto const& [k, v] : val) {           // k = first, v = second
    cout << key << ' ' << k << ' ' << v << '\n';
  }
}

除了这里的其他答案外,您还可以使用c++17来简化此问题:

for (auto const& [key, val] : someStorage) { // val = second map
  for (auto const& [k, v] : val) {           // k = first, v = second
    cout << key << ' ' << k << ' ' << v << '\n';
  }
}

谢谢你的输出。我的Gcc版本不支持自动迭代

    for (itr1 = someStorage.begin(); itr1 != someStorage.end(); ++itr1)
{
    cout << '\t' << itr1->first << ":\n";
    std::map<std::string, int> ::iterator itr2;
    for (itr2 = itr1->second.begin(); itr2 != itr1->second.end(); ++itr2)
    {
         cout << "\t\t" << itr2->first << '\n';
         cout << "\t\t" << itr2->second << '\n';
    }
}

谢谢你的输出。我的Gcc版本不支持自动迭代

    for (itr1 = someStorage.begin(); itr1 != someStorage.end(); ++itr1)
{
    cout << '\t' << itr1->first << ":\n";
    std::map<std::string, int> ::iterator itr2;
    for (itr2 = itr1->second.begin(); itr2 != itr1->second.end(); ++itr2)
    {
         cout << "\t\t" << itr2->first << '\n';
         cout << "\t\t" << itr2->second << '\n';
    }
}
itr->second是一个映射,而不是映射::迭代器。您需要像在someStorage中一样循环它的元素。itr->second是一个映射,而不是一个map::迭代器。您需要像在某些存储中一样循环它的元素。