我需要在C ++上编写自己的哈希映射。它有一个方法.get(" some_string")如果这个字符串不在我的hash_map中,我返回NULL。但是如果此函数返回NULL或字符串,我无法检查我的程序。这是我的代码:
if (m.get("some_string"))
cout << m.get("some_string");
和方法:
const string& Map::get(const string& s) {
string_node* pos = find_pos(s);
if (pos)
return pos->val;
else
return NULL;
}
pos-&gt; val只是一个字符串。所以我有一个错误,我无法从const字符串转换为bool。
问题是我需要做什么,以防止cout
中的错误,然后我的函数返回NULL
。我怎么检查呢?
答案 0 :(得分:6)
您无法为const string&
返回空值。您必须返回对实际字符串对象的引用,该对象将在函数返回后继续生效。
选项:
返回const string *
,可以为空
在null情况下抛出异常。
按值返回一个字符串,并在null情况下返回一个空(但有效)的字符串。这有两个缺点。它会复制结果,您无法再识别空案例和真正的空字符串值,而无需从函数中输出更多信息。
答案 1 :(得分:1)
引用不能为null,因此从函数返回NULL
是没有意义的。同样,您使用const string&
作为条件,因此它尝试将其转换为bool,但没有合适的转换。相反,返回一个空字符串并检查返回值是否等于:
if (pos)
return pos->value;
else
return "";
if( m.get("some_string") == "" ) { ... }
如果空字符串是有效值,则可以使用输出参数:
bool Map::try_get( const string& key, string& value )
{
string_node* pos = find_pos(s);
if (pos)
{
value = pos->val;
return true;
}
else
{
value = "";
return false;
}
}
答案 2 :(得分:0)
如果要返回引用,则无法返回NULL。你可以有一个特殊的回归案例。让它返回一个空字符串引用,表示哈希不存在。
答案 3 :(得分:0)
处理可选返回值的一种方法是使用Boost.Optional
。您可以像这样使用它:
boost::optional<std::string> Map::get(const std::string& s) {
// ...
}
int main()
{
if (boost::optional<std::string> os = map.get("asdf"))
{
// *os
}
}