如何在函数中没有返回值时抛出异常?

时间:2016-04-14 08:04:44

标签: function c++11 hash return-value

我在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<>如何处理此问题?

3 个答案:

答案 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_errorstd::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
}