C++ 为什么无序的_映射采用两个值?
我只是不明白-为什么要初始化一个2参数值 我知道有一个键和值…但我每次都需要特别地给出键吗?这不是有一个内部哈希函数吗 我有一个问题是:“给定2个数组,找到公共数+不同数”。很简单。虽然我的问题实际上是实现STL容器“无序映射”,因为我找不到任何明确的解释为什么它需要两个参数 我想做的是:C++ 为什么无序的_映射采用两个值?,c++,unordered-map,C++,Unordered Map,我只是不明白-为什么要初始化一个2参数值 我知道有一个键和值…但我每次都需要特别地给出键吗?这不是有一个内部哈希函数吗 我有一个问题是:“给定2个数组,找到公共数+不同数”。很简单。虽然我的问题实际上是实现STL容器“无序映射”,因为我找不到任何明确的解释为什么它需要两个参数 我想做的是: unordered_map<int> hash; hash.insert(5); if ( hash.find(5) == true) { cout << "Okay, got
unordered_map<int> hash;
hash.insert(5);
if ( hash.find(5) == true)
{
cout << "Okay, got it. It's in the hash table." << endl;
}
无序映射散列;
散列。插入(5);
if(hash.find(5)=true)
{
库特
[…]但我是否每次都需要明确给出钥匙
是的!这就是地图的意义所在。如果你不在乎钥匙,那么你可能不想要地图,但是std::set
或std::unordered\u set
正如其他人所说,地图并不是你真正想要的
他们建议的是一个集合(或无序集合)
至少在我看来,这也有点可疑。这显然更合适,但考虑到具体情况(你想拿两个列表,找出它们包含的数字,然后找出交叉点/差异)您最好将数字放入向量中,然后使用排序
和唯一
删除重复项。如果您需要进行插入和删除并保持唯一性,则集
或无序集
通常会工作得更好。如果您可以存储对数据进行重新排序,然后确保唯一性——一旦这样做了,就不需要再次修改该列表
最后,您还应该注意std::set_intersection
和std::set_difference
(或者可能是std::set_symmetric_difference
)。这些将获取一组已排序的输入(但不一定存储在std::set
)并查找(显然已经足够了)两个数字列表之间的交叉点和差异——这正是你显然需要的结果。这不是一个没有键的映射,你可能想要的是一个你可能不想要映射,而是一个std::set
?更准确地说,如果他想要一个散列容器,那么他应该使用std::unordered\t
。标准地图类型为,因此需要两种types@Travis特别是std::unordered\u set
,是的。std::set
/std::map
使用树状结构来存储项目,std::unordered\u set
/std::unordered\u map
使用哈希表来存储项目。这不是“如果你不关心值的话”?键在地图中是唯一的,值可以重复。@Barmar可能你是对的。我一直使用OPs的措辞:想存储唯一的值,但不知道为什么需要提供键。而且值在一个集合中是唯一的,所以它们可以被视为键…我不知道。如果你知道如何更好地表达,请随意编辑。这是一个了不起的合作伙伴ncise答案。谢谢!这是一个很好的例子,说明正确答案并不是把问题看得太字面;)
unordered_map<int, int> hash;