嵌套地图结构创建空地图

时间:2018-05-06 12:02:38

标签: c++ dictionary data-structures initialization

我不能让这个工作。我想初始化以下结构供以后使用。

map<pair<string,string>, map<string,vector<fs::path>>> filelist;

这意味着我为第一张地图提供了字符串对。 (例如,&#34; id1&#34;,&#34; id2&#34;)带有空的第二张地图,我可以稍后填写。所以我想做这样的事情:

filelist.insert(
     pair<pair<string,string>, pair<string,vector<fs::path>>>
     (make_pair("id1","id2), **empty map??**));

显然,当我坚持使用矢量而不是嵌套地图时,我可以这样做:

filelist.insert(pair<pair<string, string>, vector<vector<fs::path>>>
     (make_pair("id1","id2"),{}) );

但是如何初始化空地图?或者是否有替代数据结构?感谢

2 个答案:

答案 0 :(得分:1)

  

我想初始化以下结构供以后使用。   map<pair<string,string>, map<string,vector<fs::path>>> filelist;

您可以使用operator[]进行分配。 有些事情如下。

filelist[ std::make_pair("string1", "string2") ]   = value();

其中,using value = std::map< std::string, std::vector<int>>;

查看实时操作:https://www.ideone.com/lxQir7

  

是否有替代数据结构?

只有当您更详细地解释问题和数据处理要求时,才有可能降低所选数据结构的复杂性。

#include <iostream>
#include <map>
#include <string>
#include <vector>

using key = std::pair< std::string, std::string>;
using value =  std::map< std::string, std::vector<int>>;

int main ()
{
   std::map< key , value > filelist;

   value vMap;
   vMap["string"] = {1,2,3,4};

   filelist[ std::make_pair("string1", "string2") ]   = vMap;

   // to print or access 
   for(auto& key_itr: filelist)
   {
      std::cout<< "KEY: " << key_itr.first.first << " " << key_itr.first.second << "\t VALUE: ";

      for(auto& val_itr: key_itr.second)
      {
         std::cout << val_itr.first << " ";

         for(const auto& vec: val_itr.second)   std::cout << vec << " ";
      }
      std::cout << std::endl;
   }
   return 0;
}

答案 1 :(得分:1)

您可以使用默认构造函数初始化空地图。 为新引入的数据类型命名始终是一个更好的主意。 毕竟,它是一个相对复杂的数据结构。为什么不简化你的问题呢?

#include <map>
#include <vector>
#include <filesystem>

using namespace std;
using namespace std::filesystem;

using string_to_vector_of_path_map = map<string, vector<path>>;
using pair_of_strings = pair<string, string>;
using my_map = map<pair_of_strings, string_to_vector_of_path_map>;

my_map filelist;

int main()
{
    filelist.insert(make_pair(make_pair("id1", "id2"), string_to_vector_of_path_map()));
    return 0;
}