C++ 为什么无序的_映射采用两个值?

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

我只是不明白-为什么要初始化一个2参数值

我知道有一个键和值…但我每次都需要特别地给出键吗?这不是有一个内部哈希函数吗

我有一个问题是:“给定2个数组,找到公共数+不同数”。很简单。虽然我的问题实际上是实现STL容器“无序映射”,因为我找不到任何明确的解释为什么它需要两个参数

我想做的是:

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;