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

jok*_*oon 65 c++ map

map<string, string> dada;
dada["dummy"] = "papy";
cout << dada["pootoo"];
Run Code Online (Sandbox Code Playgroud)

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

And*_*zos 66

map::operator[]搜索对应于给定键的值,并返回一个参考给它的数据结构.

如果找不到它,它会透明地为它创建一个默认的构造元素.(如果您不想要此行为,则可以使用该map::at功能.)

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

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

这是map::operator[]来自当前C++标准的文档......

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. 复杂性:对数.

  • 实际上我没有在标准中找到这样的说法。至少,不是在 23.3.1.2 [lib.map.access] 或我记得检查过的任何其他地方。编辑:显然我正在查看该标准的旧版本。我的错。 (2认同)

Moh*_*ber 16

如果您尝试访问key value使用索引运算符[],则可能发生以下两种情况:

  1. 地图包含这个key.所以它会返回相应的key value.
  2. 地图不包含key.在这种情况下,它会自动添加key到地图中null value.

"pootoo"您的地图中不存在密钥.因此,它会自动添加这keyvalue = ""(空字符串).并且您的程序将打印空字符串.

这里地图大小会增加1.

要搜索您可以使用的密钥map_name.find(),map_name.end()如果该密钥不存在,将返回该密钥.并且不会key添加额外的内容.

如果[]要为键设置值,可以使用运算符.


Luc*_*ore 7

这不是未定义的行为.如果operator []找不到所提供键的值,则在该位置插入一个值.


Mic*_*hne 6

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