Я создаю обычную хеш-таблицу на основе линейного зондирования в C++ 11, в которой я создал функцию get()
. Функция должна возвращать значение, соответствующее ключу в хеш-таблице. Это мой код:Как выбросить исключение, когда в функции не возвращается значение?
template<class Key, class Value>
Value OpenMap<Key,Value>::get(const Key& k){
int index = hash(k);
int i = index;
do{
if(buff[i].empty)
break;
if(buff[i].elem.key==k)
return buff[i].elem.value;
i = (i+1)%capacity;
}while(i!=index);
}
Проблема в том, что каждый переданный ключ может не иметь соответствующего значения в хэш-таблице. В этой функции я не могу понять, как справиться с этим исключением. Каковы возможные способы устранения этого исключения и как это работает C++ STL unordered_map<>
?
[ 'станд :: unordered_map'] (http://en.cppreference.com/w/cpp/container/unordered_map) решает эту проблему путем создания * * запись в таблице. Если вы используете оператор индексирования (['operator []'] (http://en.cppreference.com/w/cpp/container/unordered_map/operator_at), чтобы получить элемент с карты, а ключ не существует, тогда запись создается по умолчанию - построение значения. Затем возвращается вновь построенное значение. –
@JoachimPileborg Да, но это то, что делает 'operator []'. В моем коде у меня также есть аналогичная функция, которая добавляется в случае, если нет значения соответствующего ключа. Но мне нужно обработать исключение в этой функции 'get (Key)'. –
Хорошо, я понимаю. В этом случае 'std :: unodered_map' имеет дело с ним, не имея прямой функции' get' вообще. Вместо этого у него есть функция ['find'] (http://en.cppreference.com/w/cpp/container/unordered_map/find), которая возвращает итератор. Поэтому он просто борется с вашей проблемой, избегая этого. –