C++ 中 <int, bool> 的映射默认为 false

Map of <int, bool> in C++ defaults to false

提问人:Vatsal Aggarwal 提问时间:7/12/2023 最后编辑:Ted LyngmoVatsal Aggarwal 更新时间:7/12/2023 访问量:88

问:

我想在我的地图中插入自定义值,这发生在代码的第一部分,但不在第二部分。我的代码如下:

// First part of the code

unordered_map<int, int> hashmap;

for(int i=0; i<arr.size(); i++)
{
    if(hashmap.find(arr[i]) != hashmap.end())
        hashmap[arr[i]] += 1;
    hashmap.insert(make_pair(arr[i], 1));
}

// Second part of the code

unordered_map<int, bool> hash2;
    
for(auto it=hashmap.begin(); it != hashmap.end(); ++it)
{
    if(hash2[it->second] == true)
        return false;
    hash2.insert(make_pair(it->second, true));
}
return true;

当我尝试创建自定义映射(键值对)并将“值”设置为 1 时,它正在工作,但是当我尝试在代码的第二部分创建自定义映射时,它默认为 .false

谁能帮我调试这个问题?

C++ 数据结构 14 C+ +标准库

评论

0赞 Remy Lebeau 7/12/2023
注意:在第一个循环中,如果成功,则元素递增,后续循环失败。如果失败,则跳过增量,并成功。您缺少一个 ,例如: 在这种情况下,您可以将其简化为: 让地图将新插入的元素设置为 0,然后再返回它们进行递增。find()insert()find()insert()elsefor(int i = 0; i < arr.size(); ++i) { if (hashmap.find(arr[i]) != hashmap.end()) { hashmap[arr[i]] += 1; } else { hashmap.insert(make_pair(arr[i], 1)); } }for(int i = 0; i < arr.size(); ++i) { hashmap[arr[i]]++; }

答:

5赞 Ted Lyngmo 7/12/2023 #1

让我们看第二部分:

unordered_map<int, bool> hash2;

for(auto it=hashmap.begin(); it != hashmap.end(); ++it)
{
    if(hash2[it->second] == true)                    // 1, 2
        return false;
    hash2.insert(make_pair(it->second, true));       // 3
}
return true;                                         // 4
  1. hash2[it->second]将插入 (),因为在此查找中首次使用 of 值时,映射中不存在 Key。如果稍后在循环中使用相同的值进行另一次查找,它将返回对为 Key 存储的 Value 的引用(并且 Value 将一直存在,直到更改为止)。bool{}falseit->secondfalse
  2. hash2[it->second]返回对插入的引用,并将其与 进行比较。由于存储在 1. 是 中,这个比较将永远是 ,所以它永远不会bool==trueboolfalsefalsereturn false;
  3. 在这里,它尝试使用与上面使用的相同 Key 进行配对,但使用映射的 Value 。这个离子总是失败,因为已经存在于映射中。inserttrueinsert
  4. 循环一直持续到完成,然后函数返回 。true

评论

0赞 Vatsal Aggarwal 7/12/2023
谢谢@Ted Lyngmo。我明白我的错误。实际上,我正在尝试使用第一个检查其唯一性的值创建另一个哈希图。我知道这可以使用 a 实现,但我也想尝试这种方法。set
0赞 Ted Lyngmo 7/12/2023
@VatsalAggarwal 不客气!当然,如果您愿意,您可以创建另一个哈希图。我不是 100% 确定您真正想做什么,而且您实际上不需要地图或检查您用于填充第一个哈希图的值是否都是唯一的。您可以直接插入第一张地图。示例 - 或使用基于范围的 for 循环使其更清晰if(hash2[it->second] == true)setreturn false
0赞 Vatsal Aggarwal 7/12/2023
因此,我需要确保每个元素的“频率”是唯一的。因此,为此,我需要第一个哈希图。然后我尝试为第一个哈希图中的这些频率构建另一个哈希图。
1赞 Ted Lyngmo 7/12/2023
啊哈,计数应该是唯一的。喜欢这个?当找到非唯一计数时,它不会直接返回,但您可能会弄清楚在哪里插入一个:-)return false;
1赞 Vatsal Aggarwal 7/12/2023
是的,这正是我想要的,是的,我在您回答后修改了我的代码以获得预期的结果。