unordered_map:如果key不在map中,返回什么?

Sam*_*erg 12 c++ unordered-map semantics

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

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

void set_tag_value(string tag, string value);

string& get_tag_value(string tag);
Run Code Online (Sandbox Code Playgroud)

如果我unordered_map.at()用来检索值,那么它将抛出我的代码需要捕获的异常,或者允许它传播到客户端代码.(尽管如此,传播例外似乎对我不友好).

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

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

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

  2. 在我的代码中,当您期望它可能找不到键,at()和catch异常,或者查找并检查iterator == map.end()时,哪个map up up方法更常用?(这部分问题是我只是想学习c ++的做事方式).

谢谢你的建议!

Jon*_*ter 13

在我看来,最好不要返回指向你保持私有的地图内容的指针,因为如果地图发生变化,指针可能会失效.

我会让函数返回一个成功代码(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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,unordered_map::at()如果找不到键,则抛出while ,unordered_map::find()返回无效的迭代器(unordered_map::end()) - 这样就可以避免以这种方式处理异常.

如果你想坚持返回一个字符串,那么只要return string();找不到键就返回一个空字符串().