我在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<>
如何处理此问题?
答案 0 :(得分:0)
如果没有找到任何值,您可以throw
出现异常,然后在您的代码中,get(...)
使用try-catch
语句
class MyException{
// ordinary class
}
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);
throw MyException();
}
...
OpenMap<int, int> myMap;
try{
int value = myMap.get( 10 );
}catch( MyException & ex ){
// do whatever you want witn ex
}
...
请注意MyException
是一个普通的类,因此它可以有构造函数和方法,例如,您可以将key
作为参数传递,然后打印一个未找到此键的消息。
答案 1 :(得分:0)
我会抛出std::invalid_argument
,虽然std::domain_error
和std::out_of_range
也有意义。
来电者只会抓住std::exception
。
答案 2 :(得分:0)
您可以考虑optional
。它采用C ++ 17标准link。你现在可以使用boost :: optional。可以检查optional
的值,如果它有值,则可以调用.get()
。该值可以随时被覆盖,也可以像指针一样被访问。
template<class Key, class Value>
boost::optional<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);
return boost::none; // empty optional
}