如何将键和值插入到cpp中另一个映射内的映射?

时间:2015-05-12 07:12:14

标签: c++ insert mapping iteration

我有这张地图:

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))

由于某种原因它没有工作

你能告诉我吗?

3 个答案:

答案 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" }