【问题标题】:Could not print map of map value in C++无法在 C++ 中打印地图值的地图
【发布时间】:2019-03-01 19:52:35
【问题描述】:

我已尝试使用以下代码 sn-ps 来打印地图值的地图,但我无法访问第二个地图值。

#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;
}

如何打印/访问这些值以及如何区分“这是层 一个”为“key1”和“key2”。因为我可以看到它越来越 如果我们分配 key2 值,则被覆盖,key1 具有相同的值。为什么?

我也期待下面的键值对

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

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

.

【问题讨论】:

  • itr-&gt;secondmap,而不是 map::iterator。您需要以与 someStorage 相同的方式循环其元素。

标签: c++


【解决方案1】:

除了这里的其他答案,您还可以使用structured binding (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';
  }
}

【讨论】:

    【解决方案2】:

    您需要第二个内部循环来遍历嵌套的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,因为循环不会修改容器。

    【讨论】:

      【解决方案3】:

      您还需要遍历您的内部地图,例如:

      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';
          }
      }
      

      【讨论】:

        【解决方案4】:

        感谢您的输出。我的 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';
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-11-14
          • 1970-01-01
          • 2015-10-05
          • 2017-06-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-05
          相关资源
          最近更新 更多