在地图中存储标准地图

Max*_*rai 29 c++ insert std map

我必须将std :: map存储为std :: map中的值

std::map< std::string, std::map<std::string, std::string> > someStorage;
Run Code Online (Sandbox Code Playgroud)

如何插入第二个(内部)地图?我尝试过:

someStorage.insert( std::make_pair("key", std::make_pair("key2", "value2")) );
Run Code Online (Sandbox Code Playgroud)

但这会引发很多错误.怎么了?

Mar*_*ork 43

尝试:

std::map< std::string, std::map<std::string, std::string> > someStorage;

someStorage["Hi"]["This Is Layer Two"] = "Value";
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢我的回答,因为它是最容易阅读的.费用很少是一个因素,**可维护性**是一个真正的成本.此代码是最容易维护的.PS.复制字符串与复制几个整数一样昂贵(因为````std :: string实现在写入方法上使用副本,因此字符串实际上没有被复制). (18认同)
  • 这是不必要的昂贵,因为它创建了一个默认字符串,然后将其重新分配给传入的值.最好的方法是Dark Falcon如何做到这一点:http://stackoverflow.com/questions/4479017/storing-std-map-in-map/4479026#4479026 - 我认为这些天你的投票只是因为你积累的积分而不是答案的质量.我希望人们花时间阅读/思考你的答案. (7认同)
  • @Oxsnarder:创建一个默认字符串然后为它指定一个`char const*'的成本是多少?默认'的std :: string`可能性能没有内存分配(如果没有的,拍了你的库提供商),再有就是'的std :: string&的std :: string ::运算符=(字符常量*)`,和当然如果字符串已经存在,那么你就避免构建一个暂时不会被插入的`std :: string` ......**我认为你这些天都是不必要的活泼的. (3认同)
  • 我对这里发生的斗争并不特别感兴趣 - 但请记住,上面的答案在语义上并不等同于`insert`,因为它会覆盖已存在的值,而`insert`则不会.当然,哪个更好取决于上下文 - 但在这种情况下的原始问题似乎确实要求`insert`. (2认同)
  • @Gracchus:使用C++ 03,性能最高可以忽略不计.使用C++ 11并移动语义,它的重要性更低.你现在需要考虑的是使用`std :: map`或`std :: unordered_map`的天气. (2认同)

Dar*_*con 25

someStorage["key"].insert(std::make_pair("key2", "value2")));
Run Code Online (Sandbox Code Playgroud)

如果你仍然想在外部地图上使用insert,这是一种方法

std::map<std::string, std::string> inner;
inner.insert(std::make_pair("key2", "value2"));
someStorage.insert(std::make_pair("key", inner));
Run Code Online (Sandbox Code Playgroud)

  • 您是否意识到someStorage ["key"]在需要时使用默认初始化值执行插入?(换句话说,如果密钥不存在,则空映射与密钥相关联) (2认同)
  • 你不应该使用make_pair.您假设实现使用pair.使用`std :: map <Key,Value> :: value_type`它就是typedefed,正是出于这个原因. (2认同)
  • 相反:C++ 0x标准说:"对于map <Key,T> key_type是Key,value_type是pair <const Key,T>." (23.4.1.2) (2认同)