我在做一个基于线性探测的自定义哈希表,在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 STLunordered_映射如何
您可以考虑<代码>可选<代码>。它位于C17标准链接中。现在可以使用boost::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
}
我会抛出std::invalid_参数
,尽管std::domain_error
和std::out_of_range
也有意义。
调用方只需捕获std::exception
。
当找不到任何值时,您可以抛出异常,然后在代码中,您可以将get(...)
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
}
...
请注意,
MyExctive
是一个普通类,所以它可以有构造函数和方法,例如,您可以将key
作为参数传递,然后打印一条消息,表明找不到此键。
我希望在数据库中找不到该项时出现异常
问题内容: 我有一个PDO功能: 当我执行选择查询以返回一行(或更多)时,它将返回例如: 当查询失败时(例如,如果我使用错误的语法),它将返回FALSE。 但是,如果在查询中未找到任何行,则它还会返回FALSE。 因此,查询中有错误且没有行的返回值都将返回FALSE。那怎么可能?仅当查询中有错误时,我才需要返回FALSE,例如,当没有结果时,我就需要返回NULL。我的功能有问题吗? 谢谢! 问题答
问题内容: 我正在使用一个API,该API声称如果成功则返回true,如果失败则返回false。但是,它也声称如果失败,则抛出不同的异常。它如何返回false并引发异常? 问题答案: 不能从单个函数调用中引发异常并返回值。 如果发生错误,它可能会执行类似返回的操作,但是如果输入无效,则会引发异常。 编辑:PaulPRO发布了一个(现已删除)答案,指出从 技术上讲, 有可能在返回当前值时在另一个线程
如您所见,它将参数和的和保存在变量中,然后将包含它们的和的eax寄存器保存在变量中,就像函数返回值一样。 这样做是因为函数是用返回值定义的吗?
问题内容: 如何从异步函数返回值?我试图喜欢这个 它给了我, 问题答案: 您不能超出范围。为了获得预期的结果,您应该将其包装到异步IIFE中,即 样品。 有关更多信息 由于返回一个Promise,因此可以将其省略,如下所示: 然后像以前一样做
问题内容: 在SO中多次问过这个问题。但是我还是收不到东西。 我想从回调中获得一些价值。请看下面的脚本进行澄清。 如果我尝试返回该值,则只是“未定义”。我遵循了SO的一些想法,但仍然失败。 那些是: 问题答案: 这是不可能的,因为您无法从同步方法内部的异步调用返回。 在这种情况下,您需要将回调传递给foo,该回调将接收返回值 问题是,如果内部函数调用是异步的,则所有“包装”此调用的函数也必须是异步