C:有条件地将键和值插入到std :: map中

前端之家收集整理的这篇文章主要介绍了C:有条件地将键和值插入到std :: map中前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我做:
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.

猜你在找的C&C++相关文章