如果我读取密钥不存在的地图值,会发生什么情况?
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);
-
效果:如果在地图中没有与x等价的键,则将value_type(x,T())插入到地图中。
-
要求:key_type应该是CopyConstructible,而mapped_type应该是DefaultConstructible。
-
返回:对* this中的x对应的mapped_type的引用。
-
复杂性:对数。
T& operator[](key_type&& x);
-
效果:如果地图中没有与x等价的键,则将value_type(std :: move(x),T())插入到地图中。
-
要求:mapped_type应该是DefaultConstructible。
-
返回:对* this中的x对应的mapped_type的引用。
-
复杂性:对数。
如果您尝试使用索引运算符[]
访问key value
,则可能发生两件事:
- 该地图包含此
key
。 所以它会返回相应的key value
。 - 该地图不包含
key
。 在这种情况下,它会自动向地图添加一个key
为null value
。
您的地图中不存在"pootoo"
键。 所以它会自动添加这个key
value = ""
(空string)。 而你的程序将打印空string。
这里地图大小会增加1
。
要search某个键,可以使用map_name.find()
,如果该键不存在,将返回map_name.end()
。 没有额外的key
将被添加。
当您想要为某个键设置值时,可以使用[]
运算符。
这不是未定义的行为。 如果operator []
没有find提供的键的值,则在该位置插入一个值。
对于运算符[],如果您尝试访问不存在的键的值,则默认构造的新值对象将被放入映射中,并返回其引用。
map
的operator[]
返回一个非const引用,您可以按照您在第二行显示的方式使用它。 以这种方式访问将创build一个value
types的默认构造元素。
如果你想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/
并检查地图::结束