Как работает функция find в unordered_map - поиск значения ключа - PullRequest
0 голосов
/ 19 мая 2018

Я решал вопрос на leetcode.com.Вопрос 2сум.Ссылка: 2сум вопрос Следующее было лучшим решением, предоставленным кем-то:

#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 голосов
/ 19 мая 2018

Когда вы ищете ключ, используя unordered_map::find, и он не найден, возвращается итератор end().Это итератор без разыменования, потому что он на самом деле не указывает на элемент.В следующей строке вы увидите, что проверяется условие:

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

И в этой ветви итератор found не разыменовывается.Так что это не проблема, если карта пуста, потому что код обрабатывает этот случай.

...