如果我做:
std::map<string,size_t> word_count; size_t value = word_count.count("a") == 0 ? 1 : 2; word_count["a"] = value;
那么如我所料,word_count [“a”]的最终值为1.如果我改为:
std::map<string,size_t> word_count; word_count["a"] = word_count.count("a") == 0 ? 1 : 2;
那么word_count [“a”]的最终值是2.为什么?
解决方法
正式地,任务的任一方可以先评估.由执行决定哪一个.如果word_count不包含“a”,则插入一个,并返回一个左值引用.如果word_count包含一个,只有后一部分发生.尽管首先评估哪一方面的不确定性,您可以按照可能的执行情况:
左边第一
没有元素存在:
operator []插入元素,因为它不在那里. count()找到它并返回1,所以最终它被赋值为2.
元素存在:
operator []返回现有的元素,count()找到它并返回1,所以最终它被赋值为2.
右边第一
没有元素存在:
count()返回0,所以你从右边得到1.然后,将“a”插入到地图中,并赋值1.
元素存在:
count()返回1,所以你从右边得到2.然后,访问word_count [“a”],并为其分配2.
结论
简而言之,你不能依靠这个来做你想要的,所以最好使用你可以依靠的东西. mrfontanini提出了一个很好的建议,所以我会编辑一下:
word_count["a"]++; word_count["a"] = std::min(word_count["a"],2);
第一行确保它被插入并且具有至少为1的值.在重复执行此操作的情况下,值为最大值的第二个限制为2.
笔记
我基于这个答案:
>当选择一方进行评估时,必须先对方进行评估,然后再对方进行评估.
>构造如word_count [“a”] = 1表现出明确的行为,即使在元素被插入然后分配到的情况下也是如此.
下面有关于这些是否真实的一些辩论和讨论.我现在已经做了一个more official.