【问题标题】:How to modify the value of a key-value Pair from a map while I do not know whether the key is exist in the map?当我不知道键是否存在于映射中时,如何从映射中修改键值对的值?
【发布时间】:2012-06-25 15:50:39
【问题描述】:

在不知道key是否存在的情况下,如何修改map中key-value Pair的值?

例如,map中有一个键值对:

a[5]   =    " H ";

// 但经过一些操作,如插入、擦除等;不知道地图中是否还有5,可以这样修改吗?:

a[5]   =   " G ";

// 或者我必须定义一个迭代位置

pos = my_map.find(5);
if( pos !=  my_map.end())
{
 pos->second   =   " G ";
}

还有其他方法可以修改映射中键值对的值吗???谢谢!!!

【问题讨论】:

    标签: c++ map stl iterator


    【解决方案1】:

    如果要设置值是否存在,请继续使用下标运算符:

    a[5] = " G ";
    

    如果不存在,它将创建一个新映射。这是由 C++ 标准保证的。

    【讨论】:

      【解决方案2】:

      标准地图有一个奇怪的属性,即索引到地图中不存在的元素会导致在该键和默认构造值之间创建关联。因此,如果元素 5 没有作为键出现在映射中,那么在您执行 a[5] 之后,它将存在并关联到一个空字符串。

      C++11 添加了一个新的 at 方法,如果映射中不存在该键,则抛出该方法,从而可以索引到 const map

      【讨论】:

      • 23.4.4.3/10 "抛出:如果不存在这样的元素,则抛出类型为 out_of_range 的异常对象。"
      • 他们没有添加 const 重载,但他们添加了一个新的 at() 方法,其行为与您描述的一样。唯一新的operator[] 重载是用于对键的右值引用。
      【解决方案3】:

      find() 的示例中,您可以通过返回的迭代器修改值:

      pos->second = " G ";
      

      如果您只想修改它是否已经存在,您应该使用这种方法,因为operator[] 将在当前不存在时创建一个新条目。如果要添加或修改,请使用operator[]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-20
        • 2018-09-13
        • 2019-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多