在 C++ 中按值从映射中擦除键、值

Erase key, value from map by value in C++

我的地图是这样定义的:

map<string, map<string, string>> _map;

但是出现的问题是我的地图的第一个值大部分是相同的,即

_map["key1"]["value1"] = "data1";
_map["key1"]["value2"] = "data2";
_map["key1"]["value3"] = "data3";
_map["key1"]["value4"] = "data4";
_map["key2"]["value5"] = "data5";

所以当我想删除任何特定的(键,值)时,我不能对迭代器使用 _map.find("key1") 因为它有重复的条目.

有没有办法使用值设置迭代器索引?

假设我要删除这个条目:

_map["key1"]["value4"] = "data4";

我该怎么做?

只是erase它:

 _map["key1"].erase("value4");

请注意,如果密钥不存在,它不会抛出异常 - 在这种情况下它 returns 0。

顺便说一句,您可以将地图的初始化改进为:

std::map<std::string, std::map<std::string, std::string>> _map 
{
   {"key1", {
               {"value1", "data1"},
               {"value2", "data2"},
               {"value3", "data3"},
               {"value4", "data4"}
             }
    },
    {"key2", {
                {"value5", "data5"}
             }
     }
 };

纳瓦兹的回答是正确的。然而,它确实有一个弱点:如果您擦除 "value5"_map["key2"] 仍将包含一个空的 map<string, string>。这可能不是您想要的。

要解决此问题,您可以使用 pair 模板并将 _map 的类型更改为:

map<pair<string, string>, string> _map;

您的作业将如下所示:

_map[make_pair("key1", "value1")] = "data1";
_map[make_pair("key1", "value2")] = "data2";
_map[make_pair("key1", "value3")] = "data3";
_map[make_pair("key1", "value4")] = "data4";
_map[make_pair("key2", "value5")] = "data5";

然后您可以像这样删除每个条目:

_map.erase(make_pair("key1", "value4"));

您可以在 <utility> header 中找到 pair 类型。