C ++中的哈希表实现-如何返回具有特定值的键

时间:2018-11-20 19:23:51

标签: c++ hash hashtable

我正在尝试使用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

2 个答案:

答案 0 :(得分:1)

std::map是一棵树,而不是哈希表。对于哈希表,您需要std::unordered_map

但要回答您的问题:

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

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

但是要注意-调用cout << mymap[X]时,它还会 X添加到地图。因此,最后删除所有这些调试行。

顺便说一句-当您没有值时,只有一个键,则可以使用set(或unordered_set)代替。

答案 1 :(得分:1)

只需增加映射中的值即可,因为整数是默认构造的(并因此初始化为exports.storeContact5 = functions.https.onCall((data, context) => { // First print is working fine console.log('test'); var recieverId = 'WqHxLoYvRxR9UK8sFJZ9WxTOIE32'; const check = admin.firestore().collection('users').doc(recieverId).get(); return check.then(testValue => { console.log(testValue.data().nickname); return {repeat_message: 'ok!'}; }).catch(err => { console.log('Error getting document', err); throw new functions.https.HttpsError('Error getting document', err); }); }); ):

0