如果我读取密钥不存在的地图值,会发生什么情况?

map<string, string> dada; dada["dummy"] = "papy"; cout << dada["pootoo"]; 

我很困惑,因为我不知道它是否被认为是未定义的行为,如何知道当我请求一个不存在的密钥,我只是使用查找呢?

map::operator[]在数据结构中search与给定键对应的值,并返回对其的引用。

如果它找不到一个,它会透明地为它创build一个默认的构造元素。 (如果你不想要这个行为,你可以使用map::at函数。)

你可以在这里获得std :: map的完整列表:

http://en.cppreference.com/w/cpp/container/map

这里是当前C ++标准的map::operator[]的文档…

23.4.4.3地图元素访问

T& operator[](const key_type& x);

  1. 效果:如果在地图中没有与x等价的键,则将value_type(x,T())插入到地图中。

  2. 要求:key_type应该是CopyConstructible,而mapped_type应该是DefaultConstructible。

  3. 返回:对* this中的x对应的mapped_type的引用。

  4. 复杂性:对数。

T& operator[](key_type&& x);

  1. 效果:如果地图中没有与x等价的键,则将value_type(std :: move(x),T())插入到地图中。

  2. 要求:mapped_type应该是DefaultConstructible。

  3. 返回:对* this中的x对应的mapped_type的引用。

  4. 复杂性:对数。

如果您尝试使用索引运算符[]访问key value ,则可能发生两件事:

  1. 该地图包含此key 。 所以它会返回相应的key value
  2. 该地图不包含key 。 在这种情况下,它会自动向地图添加一个keynull value

您的地图中不存在"pootoo"键。 所以它会自动添加这个key value = "" (空string)。 而你的程序将打印空string。

这里地图大小会增加1

要search某个键,可以使用map_name.find() ,如果该键不存在,将返回map_name.end() 。 没有额外的key将被添加。

当您想要为某个键设置值时,可以使用[]运算符。

这不是未定义的行为。 如果operator []没有find提供的键的值,则在该位置插入一个值。

对于运算符[],如果您尝试访问不存在的键的值,则默认构造的新值对象将被放入映射中,并返回其引用。

mapoperator[]返回一个非const引用,您可以按照您在第二行显示的方式使用它。 以这种方式访问​​将创build一个valuetypes的默认构造元素。

如果你想find一个元素,更好的方法是

 iterator find ( const key_type& x ) 

(或const替代),如果它找不到键,或者如果你只是想知道它是否在你可以使用的集合中,它将返回一个等于<map>.end()的迭代器

 size_type count ( const key_type& x ) const 

因为键是唯一的,所以对于地图总是会返回1或0。

请看看out_of_rangeexception: http ://www.cplusplus.com/reference/stdexcept/out_of_range/

这是map :: at和map :: operator []会在key不存在的情况下抛出。 您可以像链接中的vector示例一样捕获它。

您也可以使用: http : //www.cplusplus.com/reference/map/map/find/

并检查地图::结束