【问题标题】:Hash Table implementation in C++ - How to return a key with a particular valueC ++中的哈希表实现 - 如何返回具有特定值的键
【发布时间】:2019-04-23 07:37:25
【问题描述】:

我正在尝试使用 C++ 中的哈希表来解决编程问题。它应该是哈希表的相当简单的实现。我对哈希表非常陌生,这是我第一次尝试实现。

问题是我得到了一个包含整数的数组。除了一个整数之外,所有整数都会重复两次。我必须找到一个没有的整数。

Input: {1,2,1,3,3}
Output: 2

我的解决方案是我将开始将这些键放入哈希表中,如果我事先在哈希表中找到一个键,我将从哈希表中删除该键。

我的代码实现有效,但现在我想看看如何取回正确的值(在本例中为 2),因为即使在擦除密钥之后,密钥仍保持值为 0。

这是我的代码:

int main()
{

    int num[5] = {1,2,1,3,3};

    map <int,int> mymap;

    for(int i=0;i<5;i++)
    {
      if(mymap.find(num[i])!=mymap.end())
        {  
          mymap.erase(num[i]);
        }
      else
        {
          mymap[num[i]] = 10; //10 is just a placeholder value. 
        }
    }
    cout<<"0:"<<mymap[0]<<endl;
    cout<<"1:"<<mymap[1]<<endl;
    cout<<"2:"<<mymap[2]<<endl;   //Should only find 10 value in 2
    cout<<"3:"<<mymap[3]<<endl;
    cout<<"4:"<<mymap[4]<<endl;
}

输出:

0:0
1:0
2:10
3:0
4:0

【问题讨论】:

  • 哈希表,但是你使用的是映射,而不是unordered_map(前者是标准映射,后者是哈希映射)。

标签: c++ hash hashtable


【解决方案1】:

std::map 是一棵树,而不是哈希表。对于你想要的哈希表std::unordered_map

但要回答你的问题:

您可以使用地图iterator获取唯一剩余值:

if (!mymap.empty()) {
    cout << mymap.begin()->first;
}

但请注意 - 当您调用 cout &lt;&lt; mymap[X] 时,它还会添加 X 到地图中。所以在最后删除所有那些调试行。

顺便说一句 - 如果你没有值,只有一个键,那么你可以使用 set 代替(或 unordered_set)。

【讨论】:

  • 由于某种原因,直接实现您的代码不起作用,但使用您提供给我的链接中的迭代器工作。 if (!mymap.empty()) { auto it = mymap.begin(); cout first; }
  • 另外,感谢您整理了基础知识。你的回答很有帮助。
  • 啊,是的,正在考虑这个集合,答案已更新。应该改用-&gt;first(但考虑使用set
【解决方案2】:

只需增加映射中的值,因为整数是默认构造的(因此初始化为0):

int num[5] = {1,2,1,3,3};

unordered_map <int,int> mymap;

for(int i=0;i<5;i++)
{
   ++mymap[num[i]];
}
cout<<"0:"<<mymap[0]<<endl;
cout<<"1:"<<mymap[1]<<endl;
cout<<"2:"<<mymap[2]<<endl;   //Should only find 10 value in 2
cout<<"3:"<<mymap[3]<<endl;
cout<<"4:"<<mymap[4]<<endl;

【讨论】:

    猜你喜欢
    • 2012-07-06
    • 2013-08-21
    • 2013-03-05
    • 2011-08-22
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多