我有这张地图:
std::map<std::string, std::map<std::string, std::string> > objects;
据我所知,当我写objects[key]
时,它将替换已存在的密钥的值,但是如果该对不存在,我希望它添加到第二个映射。< / p>
Example:
Current MAP :("key1",map(<"key_a","value_a">,<"key_c","value_d">))
input:
"key1", "key_e","value_f"
relsult:
("key1",map(<"key_a","value_a">,<"key_c","value_d">,<"key_e","value_f">))
input :
"key1", "key_e","value_g"
(replace the value from "value_f" to "value_g")
result:
("key1",map(<"key_a","value_a">,<"key_c","value_d">,<"key_e","value_g">))
and if I get "key2" -> it will insert new key with empty map
我可以这样做:
objects[key].insert(std::make_pair(key2,value2))
由于某种原因它没有工作
你能告诉我吗?答案 0 :(得分:1)
据我所知,当我写
objects[key]
时,它将替换已存在的密钥的值,但是如果该对不存在,我希望它添加到第二个映射。< / p>
那是错的:如果你写objects[key]
并不能取代任何东西,那么;而:
如果objects
尚未包含key
,则会在地图中插入一个新对,并使用默认构造的值(在这种情况下为空) )std::map<std::string, std::string>
。然后它返回对值的引用。
如果objects
确实包含key
,则会返回对现有值的引用(&#34;内部&#34;地图)而不更改或替换任何内容。
我可以这样做:
objects[key].insert(std::make_pair(key2,value2))
你可以,但是如果[key][key2]
已经存在且不会将值更新为value2
,我认为这就是你想要的,为什么你说&#34;它没有工作&#34; 。
您所要做的就是:
objects[key][key2] = value2;
由于objects[key]
永远不会替换现有的map
,但如果key
缺失,则默认构造一个,key2
或者找到现有条目&#34;内&#34;需要更新或创建的地图,这一切都挂在一起(如果我已正确理解您的要求)。
答案 1 :(得分:0)
也许你的意思是这样的? http://www.cplusplus.com/reference/map/map/operator%5B%5D/ http://www.cplusplus.com/reference/map/map/count/
std::map<std::string, std::map<std::string, std::string> > objects;
if (objects.count("your_key") > 0)
{ // insert a key ("another_key") into map
objects["your_key"]["another_key"] = "some value";
} else
{ // create the new map for the key
objects["your_key"] = std::map<std::string, std::string>();
}
答案 2 :(得分:0)
您可以使用方法insert
。这是一个示范程序
#include <iostream>
#include <string>
#include <map>
int main()
{
std::map<std::string, std::map<std::string, std::string>> objects;
objects["key1"] = { { "key_a", "value_a" }, { "key_c", "value_d" } };
objects["key1"].insert( { "key_e", "value_f" } );
for ( const auto &p1 : objects )
{
std::cout << "\"" << p1.first << "\": ";
for ( const auto &p2 : p1.second )
{
std::cout << "{ \"" << p2.first
<< "\", \"" << p2.second
<< "\" }" << ' ';
}
std::cout << std::endl;
}
objects["key1"]["key_e"] = "value_g";
for ( const auto &p1 : objects )
{
std::cout << "\"" << p1.first << "\": ";
for ( const auto &p2 : p1.second )
{
std::cout << "{ \"" << p2.first
<< "\", \"" << p2.second
<< "\" }" << ' ';
}
std::cout << std::endl;
}
return 0;
}
程序输出
"key1": { "key_a", "value_a" } { "key_c", "value_d" } { "key_e", "value_f" }
"key1": { "key_a", "value_a" } { "key_c", "value_d" } { "key_e", "value_g" }