提问人:Vatsal Aggarwal 提问时间:7/12/2023 最后编辑:Ted LyngmoVatsal Aggarwal 更新时间:7/12/2023 访问量:88
C++ 中 <int, bool> 的映射默认为 false
Map of <int, bool> in C++ defaults to false
问:
我想在我的地图中插入自定义值,这发生在代码的第一部分,但不在第二部分。我的代码如下:
// 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
谁能帮我调试这个问题?
答:
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
hash2[it->second]
将插入 (),因为在此查找中首次使用 of 值时,映射中不存在 Key。如果稍后在循环中使用相同的值进行另一次查找,它将返回对为 Key 存储的 Value 的引用(并且 Value 将一直存在,直到更改为止)。bool{}
false
it->second
false
hash2[it->second]
返回对插入的引用,并将其与 进行比较。由于存储在 1. 是 中,这个比较将永远是 ,所以它永远不会bool
==
true
bool
false
false
return false;
- 在这里,它尝试使用与上面使用的相同 Key 进行配对,但使用映射的 Value 。这个离子总是失败,因为键已经存在于映射中。
insert
true
insert
- 循环一直持续到完成,然后函数返回 。
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)
set
return false
0赞
Vatsal Aggarwal
7/12/2023
因此,我需要确保每个元素的“频率”是唯一的。因此,为此,我需要第一个哈希图。然后我尝试为第一个哈希图中的这些频率构建另一个哈希图。
1赞
Vatsal Aggarwal
7/12/2023
是的,这正是我想要的,是的,我在您回答后修改了我的代码以获得预期的结果。
评论
find()
insert()
find()
insert()
else
for(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]]++; }