c++ - unordered_map : what to return if key is not in map?

标签 c++ semantics unordered-map

作为这个问题的前言,我不得不说我是一名 Java 程序员,因此比 C++ 更习惯 Java 中的 Maps 语义。在 Java 中,当在 Map 中查找键时,返回 null 是很常见的。我正在将我们的一些代码翻译成 c++,并尝试在与 unordered_map 交互时找到 c++ 的处理方式。

具体来说,我有一个包含 unordered_map 的类。我没有将映射直接暴露给客户端代码,而是有 2 个包装函数,一个用于将键/值对放入映射中,另一个用于检索指定键的值,即:

void set_tag_value(string tag, string value);

string& get_tag_value(string tag);

如果我使用 unordered_map.at() 来检索值,那么它将引发我的代码需要捕获的异常,或者允许它传播到客户端代码。 (不过,将异常(exception)传播给我似乎不友好)。

也许另一种方法是将返回值更改为 string* 类型,如果找不到则返回 NULL(这是 Java 的做法),但随后用户需要检查NULL(这也不是那么友好)。

所以我的问题有两个部分:

  1. 什么是开发人员友好的方式来处理失败的查找,什么返回值有用(异常、NULL、空字符串或其他)?

  2. 在我的代码中,当您期望它可能找不到键时,使用哪种映射查找方法更典型,at() 并捕获异常,或查找并检查迭代器 == map.end()? (这部分问题是我只是想学习c++的做事方式)。

感谢您的建议!

最佳答案

在我看来,最好不要返回指向您保持私有(private)的 map 内容的指针,因为如果 map 更改,这些指针可能会失效。

我会让函数返回一个成功代码 (bool) 并传递一个对字符串的引用以实际返回如果找到的值。例如,

bool get_tag_value(const string& tag, string& value)
{
    auto t = my_map.find(tag);
    if (t == my_map.end()) return false;
    value = t->second;
    return true;
}

请注意,虽然 unordered_map::at() 将在找不到键时抛出,但 unordered_map::find() 返回无效的迭代器(unordered_map::end()) - 所以你可以避免以这种方式处理异常。

如果你想坚持返回一个字符串,那么如果没有找到键,则只需返回一个空字符串 (return string();)。

关于c++ - unordered_map : what to return if key is not in map?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19191247/

相关文章:

c++ - _stat 返回不可能的 errno 代码 132

c++ - cv::String 和 std::string:何时使用哪一个以及同时使用两者的必要性?

c++ - C++ Singleton vs静态类vs extern vs命名空间

c++ - 无法使用 boost 验证我的自签名证书

css - html5 : css styling: <ul> <li> vs <p> for column of links

javascript - 这是正确的标记吗 - 空元素或使用 css/js 来实现相同的效果

c++ - Bison 中哈希查找的问题

java - 使用 Java 进行命名实体识别

c++ - 高效的字符串到 unordered_map 中的键匹配?

c++ - 使用 C++0x 的 unordered_map