在成本字符串中返回空值&;功能 我需要在C++上编写自己的散列图。它有一个method.get(“some_string”),如果这个字符串不在我的hash_映射中,我将返回NULL。但是我不能在我的程序中检查这个函数是否返回NULL或string。这是我的代码: if (m.get("some_string")) cout << m.get("some_string");
pos->val只是一个字符串。所以我有一个错误,我不能从常量字符串转换为布尔。在成本字符串中返回空值&;功能 我需要在C++上编写自己的散列图。它有一个method.get(“some_string”),如果这个字符串不在我的hash_映射中,我将返回NULL。但是我不能在我的程序中检查这个函数是否返回NULL或string。这是我的代码: if (m.get("some_string")) cout << m.get("some_string");,c++,C++,pos->val只是一个字符串。所以我有一个错误,我不能从常量字符串转换为布尔。 问题是我需要做什么,以防止cout中出现错误,然后我的函数返回NULL。如何检查它?您不能为常量字符串&返回空值。必须返回对真实字符串对象的引用,该对象将在函数返回后继续存在 选项: 返回一个常量字符串*,该字符串可以为空 在null情况下引发异常 按值返回字符串,并在null情况下返回空(但有效)字符串。这有两个缺点。它复制结果,如果不从函数输出更多信息,您将无法再区分null大小写和真正的空字符串值 如果返回
问题是我需要做什么,以防止
cout
中出现错误,然后我的函数返回NULL
。如何检查它?您不能为常量字符串&返回空值。必须返回对真实字符串对象的引用,该对象将在函数返回后继续存在
选项:
- 返回一个
,该字符串可以为空常量字符串*
- 在null情况下引发异常
- 按值返回字符串,并在null情况下返回空(但有效)字符串。这有两个缺点。它复制结果,如果不从函数输出更多信息,您将无法再区分null大小写和真正的空字符串值
null
没有意义。同样,您使用的是常量字符串&
作为条件,因此它尝试将其转换为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;
}
}
处理可选返回值的一种方法是使用。您可以这样简单地使用它:
boost::optional<std::string> Map::get(const std::string& s) {
// ...
}
int main()
{
if (boost::optional<std::string> os = map.get("asdf"))
{
// *os
}
}
boost::可选映射::get(const std::string&s){
// ...
}
int main()
{
if(boost::optional os=map.get(“asdf”))
{
//*操作系统
}
}
如果空字符串是存储在此映射中的有效值,该怎么办?我认为空字符串永远不会显示为哈希。@sgtale做出假设是产生错误的最快方法。不过请注意,这将强制将值复制到value
参数引用的字符串中,这可能不是必需的。让调用者自己决定是否复制,然后返回指针。如果空字符串是存储在此映射中的有效值,该怎么办?然后不要使用空字符串。当然,它最终将取决于实现的具体程度。但是知道哈希函数是否可以返回一个空字符串可能是你应该知道的,即使你考虑返回这样一个特殊的情况。这就是std::map所做的。或者使用输出参数并返回布尔值,无论它是否成功。@clcto没有理由这样做,因为指针已经可以传递空值,并且不会强制复制该值。@SHR添加了有关返回空字符串的信息。@SHR:不完全正确std::map
创建一个空元素,然后返回它代码>这里有未定义的行为。函数必须构造一个string
对象来返回,并使用NULL
作为string
构造函数的参数。这将调用string
的char*
构造函数,该构造函数的前提条件是不向其传递空指针。因此,由于违反了前提条件,您得到了get UB。另外,您应该会收到关于返回对本地对象的引用的警告,这将返回一个悬空引用。您应该在启用警告的情况下进行编译,并且应该注意收到的警告。“我需要在C++上编写自己的哈希映射”不,您不需要t@NeilNULL
转换为const char*
innit。这就是为什么nullptr
存在并且每个人都应该使用它的原因。@Dima:NULL
是string\u节点*
的有效初始化器。对于std::string
@Dima,它不是有效的初始化器。请看一下。这显示了您应该得到的编译器警告(如果您没有得到警告,那么您应该在编译器上提高警告级别,或者获得一个新的编译器)。此外,如果您能够理解为什么程序的输出是这样的,那么希望您能够理解将string\u node*
与const string&
一样处理的错误(1)返回类型应该是boost::optional
(既不是const,也不是引用)。(2) 请注意,这种方法将导致复制值,以便按值返回,这将导致性能损失。@cdhow我最初有这种情况,但复制OP的示例时遇到问题。
boost::optional<std::string> Map::get(const std::string& s) {
// ...
}
int main()
{
if (boost::optional<std::string> os = map.get("asdf"))
{
// *os
}
}