[英]Incrementing non-existent map entries
我了解,如果您引用不存在的 map 条目,则 map::operator[] 在 map 中搜索与给定键对应的值,并返回对它的引用。 如果找不到它,它会为其创建一个默认构造元素。 话虽这么说,在以下情况下会发生什么情况,即尝试增加 map 中不存在的密钥? 密钥的价值最终会是什么? IE
map<string,int> m;
...
string s = "dog"
m["dog"]++
在您给出的示例中,您增加了值,而不是键。 也就是说, m[dog]++
会影响值本身。 如果给定的键不存在,map 将首先插入一个具有零初始化或默认构造值的键值对,然后尝试将operator++
应用于该值。 如果未为该值定义此运算符,则编译失败。 如果值为int
,您最终将拥有一个对应于1
的"dog"
键。
如果要增加密钥,则应将增量应用于密钥。 在这里,首先,您应该考虑 post 和 pre increment 之间的区别。 也就是说,当您执行以下操作时:
m[dog++];
仅在您调用operator[]
后,该键才会增加,这意味着此增量根本没有任何效果。 如果您希望此增量影响调用,请使用预增量。
其次,确保您使用的键的类型具有重载的operator++
。 字符串没有,所以这段代码根本不会编译。
因此,唯一可以发生增量的情况是当您使用预增量并且为您用作键的类型定义operator++
时。 如果key
是某种整数类型,您可以考虑:
int key = 0;
m[++key];
在这种情况下,如果键1
不存在,map 将插入一个新的对,键为1
和零初始化或默认构造值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.