find函数在unordered_map中的工作原理是搜索键值

时间:2018-05-19 16:26:04

标签: c++ unordered-map

我在leetcode.com上解决了这个问题。问题是2sum。链接:2sum question 以下是某人提供的最佳解决方案:

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

class Solution{
public:
vector<int> twoSum(vector<int> &nums, int sum){
    //write code here
    int len = nums.size();
    unordered_map<int, int> hashTable;

    for(int i=0; i<len; i++){
        int diff = sum - nums[i];
        auto found = hashTable.find(diff);
        if(found == hashTable.end()){
            hashTable.insert(pair<int, int>{nums[i], i});
        }
        else{
            return vector<int>{found->second, i};
        }
    }
}
};

int main()
{
    vector<int> myArray;
    vector<int> outputArray;
    int sum,n,temp;
    cout<<"enter the size of the array\n";
    cin>>n;
    cout<<"enter the integers\n";
    for(int i=0; i<n; i++){
        cin>>temp;
        myArray.push_back(temp);
    }
    cout<<"enter the sum\n";
    cin>>sum;
    Solution s;
    outputArray = s.twoSum(myArray, sum);
    cout<<"["<<outputArray[0]<<","<<outputArray[1]<<"]"<<endl;

    return 0;
}

在上面的代码中,auto found = hashTable.find(diff);这条线是如何工作的,因为hashTable从未被初始化。那么,它是如何找到diff值的。然后if条件如何工作? 当我尝试使用迭代器打印hashTable的内容时,它返回空值,即hashTable为空。然后如何找到diff值? 请帮助我理解。 感谢所有的意见。

1 个答案:

答案 0 :(得分:1)

使用unordered_map::find搜索密钥时,如果找不到密钥,则会返回end()迭代器。这是一个不可解除引用的迭代器,因为它实际上并没有指向一个元素。您可以在下一行中看到这是正在检查的条件:

if(found == hashTable.end()){

在此分支中,found迭代器未被解除引用。因此,如果地图为空,这不是问题,因为代码会处理这种情况。