代码之家  ›  专栏  ›  技术社区  ›  riasc

嵌套贴图结构创建空贴图

  •  1
  • riasc  · 技术社区  · 6 年前

    我不想让这件事发生。我想初始化以下结构以供以后使用。

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

    这意味着我为第一个映射提供了字符串对。(例如,“id1”、“id2”),第二个映射为空,我可以稍后填写。所以我想这样做:

    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 回复  |  直到 6 年前
        1
  •  1
  •   JeJo    6 年前

    我想初始化以下结构以供以后使用。 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;
    }
    
        2
  •  1
  •   wxShayan    6 年前

    只需通过其默认构造函数即可初始化空映射。 最好给新引入的数据类型命名。 毕竟,它是一个相对复杂的数据结构。你为什么不简化你的问题?

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