【问题标题】:Erase key, value from map by value in C++在 C++ 中逐个值擦除键、值
【发布时间】:2016-04-11 06:58:58
【问题描述】:

我的地图是这样定义的:

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";

我该怎么做?

【问题讨论】:

  • 您的问题不清楚。您似乎在问如何从地图中删除元素,这在文档中很容易找到。您能否澄清一下您要解决的问题是什么?
  • 地图中每个键的值不能超过一个。
  • @A.Franzen:每个键的值不超过一个。仔细看!
  • 哦,我明白了,您将内部映射称为“键”“值”。这令人困惑。
  • 您的地图中没有重复的键。根据定义,这是不可能的。就像在矩阵中有重复的索引:这是不可能的。

标签: c++ dictionary iterator erase


【解决方案1】:

erase吧:

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

请注意,如果键不存在,它不会抛出异常——在这种情况下它会返回 0。

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

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

【讨论】:

    【解决方案2】:

    纳瓦兹的回答是正确的。但是,它确实有一个弱点:如果您删除"value5"_map["key2"] 仍将包含一个空的map&lt;string, string&gt;。这可能不是您想要的。

    要解决此问题,您可以使用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"));
    

    您可以在&lt;utility&gt; 标头中找到pair 类型。

    【讨论】:

    • 他的数据是否仍会按照您的方式进行初始化,而不是按照他的方式进行组织?问是因为我真的不知道。
    • 是的,会的。 std::pair 定义了一个比较,首先按第一个坐标排序,然后按第二个。
    • 擦除给我一个错误。它不识别参数。我不能像那样删除它。我也尝试传递一个 const 对,但仍然不起作用。
    • 错误:没有匹配函数调用 'std::map<:__cxx11::basic_string>, std::map<:__cxx11::basic_string>, Session > >::erase(std::pair<:__cxx11::basic_string>, Session>)' _map.erase(make_pair("contact", session));
    • 基本上,它不会让我将 pair 传递给 erase
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多