Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在成本字符串中返回空值&;功能 我需要在C++上编写自己的散列图。它有一个method.get(“some_string”),如果这个字符串不在我的hash_映射中,我将返回NULL。但是我不能在我的程序中检查这个函数是否返回NULL或string。这是我的代码: if (m.get("some_string")) cout << m.get("some_string");_C++ - Fatal编程技术网

在成本字符串中返回空值&;功能 我需要在C++上编写自己的散列图。它有一个method.get(“some_string”),如果这个字符串不在我的hash_映射中,我将返回NULL。但是我不能在我的程序中检查这个函数是否返回NULL或string。这是我的代码: if (m.get("some_string")) cout << m.get("some_string");

在成本字符串中返回空值&;功能 我需要在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大小写和真正的空字符串值 如果返回

pos->val只是一个字符串。所以我有一个错误,我不能从常量字符串转换为布尔。
问题是我需要做什么,以防止
cout
中出现错误,然后我的函数返回
NULL
。如何检查它?

您不能为常量字符串&返回空值。必须返回对真实字符串对象的引用,该对象将在函数返回后继续存在

选项:

  • 返回一个
    常量字符串*
    ,该字符串可以为空

  • 在null情况下引发异常

  • 按值返回字符串,并在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@Neil
NULL
转换为
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
    }
}