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

C++ 如何将键和值插入到cpp中另一个映射内的映射?,c++,insert,mapping,iteration,C++,Insert,Mapping,Iteration,我有这张地图: std::map<std::string, std::map<std::string, std::string> > objects; 我可以这样做吗: objects[key].insert(std::make_pair(key2,value2)) 因为某种原因它不起作用 你能给点建议吗?也许你是说这样的事? std::映射对象; 如果(objects.count(“您的_键”)>0) {//在映射中插入一个键(“另一个_键”) 对象[“您的密钥”

我有这张地图:

std::map<std::string, std::map<std::string, std::string> > objects;
我可以这样做吗:

objects[key].insert(std::make_pair(key2,value2))
因为某种原因它不起作用


你能给点建议吗?

也许你是说这样的事?

std::映射对象;
如果(objects.count(“您的_键”)>0)
{//在映射中插入一个键(“另一个_键”)
对象[“您的密钥”][“另一个密钥”]=“某些值”;
}否则
{//为密钥创建新映射
对象[“您的密钥”]=std::map();
}

您可以使用方法
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;
}
据我所知,当我编写
objects[key]
时,它将替换已经存在的密钥的值,但在这里,如果密钥对不存在,我希望它添加到第二个映射中

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
这是错误的:如果你写
对象[key]
是不会取代任何东西的,永远不会;而是:

  • 如果
    对象
    尚未包含
    ,它将在映射中插入一个新的键对,并使用默认构造的值(在本例中为空)
    std::map
    。然后返回对该值的引用

  • 如果
    对象
    确实包含
    ,则返回对现有值(“内部”映射)的引用,而不更改或替换任何内容

我可以这样做:
objects[key].insert(std::make\u pair(key2,value2))

可以,但如果
[key][key2]
已经存在,则不会将值更新为
value2
,我假设这就是您想要的,也是您说“它不起作用”的原因

你所要做的就是:

objects[key][key2] = value2;

因为
objects[key]
从不替换现有的
map
,但是如果缺少
key
,则默认会构造一个映射,然后
key2
在“内部”映射中找到需要更新的现有条目或创建它,这一切都挂在一起(如果我正确理解了您的需求)。

什么不起作用?错误/问题是什么?没有“第二个”映射,std::map的每个键都与一个映射相关,您有x个“第二个”映射……您发布的代码应该按照您描述的那样执行。请展示一下它是如何不起作用的(包括你到底做了什么,预期的结果和观察到的结果)。@Mike Seymour你是对的。感谢您指出我的错误。请确保->插入不会更新值,但使用objects[key][key2]会更新值吗?第二个选项还将在所有计数中插入不存在的key2?@user1386966 yes
"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" } 
objects[key][key2] = value2;