如果我读取密钥不存在的地图值,会发生什么情况?
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一个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/
并检查地图::结束