什么是;result.second==false";这是什么意思? 我遇到了C++中用于计数向量中的频率的代码。

什么是;result.second==false";这是什么意思? 我遇到了C++中用于计数向量中的频率的代码。,c++,vector,C++,Vector,std::map<std::string, int> countMap; // Iterate over the vector and store the frequency of each element in map for (auto & elem : vecOfStrings) { auto result = countMap.insert(std::pair<std::string, int>(elem, 1)); if (result.s

std::map<std::string, int> countMap;

// Iterate over the vector and store the frequency of each element in map
for (auto & elem : vecOfStrings)
{
   auto result = countMap.insert(std::pair<std::string, int>(elem, 1));
   if (result.second == false)
      result.first->second++;
}
std::map countMap;
//迭代向量并将每个元素的频率存储在map中
用于(自动和元素:矢量字符串)
{
自动结果=countMap.insert(std::pair(elem,1));
如果(result.second==false)
结果.第一->第二++;
}
从。我想问你,你做了什么

result.second==false
mean?

来自:

将由迭代器组成的对返回给插入的元素(或 指向阻止插入的元素)和表示 插入是否发生

result.first
为元素提供迭代器,而
result.second
告诉您元素是实际插入的还是已经存在的。

返回一对,其中第二个值指示是否确实发生了插入。如果该值为
false
,则表示没有向映射中插入值,因为已存在具有相同键的值

但是,代码不应该这样编写:与布尔文本进行比较是一个毫无意义的操作。相反,你会写信

if (not result.second)
// or
if (! result.second)
返回一个
std::pair

pair.first
是新插入的元素或映射中已存在并阻止插入的元素的迭代器。
pair.second
指示是否发生了插入

result.second==false
正在检测由于键冲突而未向映射中插入任何内容的情况

请注意,使用C++17,这可以写得更清楚一些:

auto [itr, inserted] = countMap.insert({elem, 1});
if (!inserted) {
    itr->second++;
}

返回一对迭代器和一个
bool
bool
指示插入是否实际发生。如果由于
std::map
而在
insert

上发生键冲突,则您列出的代码似乎会增加映射的
int
,而其他非多关联容器仅存储唯一的项,当您向其中插入某个项时,它可能不会实际插入,因为它可能已经存在<因此,code>insert返回一个
std::pair
,如果插入成功,bool将为true,否则为false


我想指出的是,您可以去掉循环中的if语句。由于映射的
操作符[]
的工作方式,循环可以替换为

for (const auto & elem : vecOfStrings) // also added const here since we don't need to modify elem
{
   ++countMap[elem];
}

现在,如果
elem
存在,那么您将增加值,如果不存在,您将
elem
添加到地图并增加其值。

老实说,奇怪的是,为什么您在发布的示例中只要求帮助最简单的行。。。。我为自己的愚蠢道歉。我想你会发现自己。。。首先研究
std::map::insert
返回的内容。那么我希望你知道什么是
==false
的意思。不是“愚蠢”,但是你应该试着养成习惯,当你不确定事情是怎么做的时候,就去查阅它们!我确实查过了。但是我不知道我不能在地图中有相同键的项目,所以使用
false
对我来说没有意义。第二个让我想到了地图上的值,所以把这个值和false比较让我很困惑。这有什么“荒谬”的?从字面上讲,它和你提出的备选方案一样有意义。(而且,主观上,它有更明确/清晰的好处。)@Asterbouts认为这是荒谬的,因为它是多余的。如果你写
x==false
,为什么不进一步写
(x==false)==true
,因为
x==false
也是一个布尔值。很明显,你不会到此为止,因为它的结果也是一个布尔值。在更正式的术语中,您不必要地使用了一个非标准化的逻辑术语。@swithwings我没有声称它们是相同的。但是这个手术是荒谬的,因为它是多余的。我的论点并不是从一个危险的角度出发。这是一种荒谬的还原。这两个在结构上是相似的,但完全不同。@swithwings不。它们可以是正交的,但在这种情况下不是。真可惜。我真的很想看到消除那些讨厌的东西,其中之一就是多余地使用字面布尔。当然,这是一个小麻烦,但却是一个完全不必要且可以避免的语法混乱。这并不等同于原始代码。当没有发生冲突时,整数应该保留为0。@AndreySemashev OP使用
countMap.insert(std::pair(elem,1))
将初始值设置为1遗憾的是
std::map::operator[]
正是为这种情况而设计的,甚至在上的例子中也列出了字数计算,但人们并不费心去看文档。委员会中那些“赞成的选民”设计了
std::map::operator[]
,允许隐式插入,他们需要一个严厉的谈话。@Slava不幸的是,cplusplus.com仍然有很多流量,首先出现在搜索结果中,它的示例是缺少的:使用C++11,整个循环可以重写,正如@NathanOliver在他的答案中所显示的那样,这一点更加清楚:)