gpt4 book ai didi

c++ - 返回迭代器时,返回迭代器类型还是返回实际对象更好

转载 作者:行者123 更新时间:2023-11-30 02:35:42 25 4
gpt4 key购买 nike

在我下面的代码中,在哈希表中查找一个值,如果在映射中找不到该键,我很困惑该怎么办。

返回迭代器是否更好以便调用者可以检查它?

引发异常是否更好?

还是做点别的?

代码如下:

#include <vector>
#include <algorithm>
#include <string>
#include <unordered_map>

struct binary_message
{
binary_message(std::initializer_list<unsigned char> data) : bytes_(data) {}
std::vector<unsigned char> bytes_;
};


// warning C4715: 'lookup_msg' : not all control paths return a value
static const binary_message& lookup_msg(const std::string& key) {
static std::unordered_map<std::string, binary_message> table =
{
{ "msg1", { 0x60, 0x23, 0x80, 0x02, 0x07, 0x80, 0xa1, 0x07, 0x06, 0x05, 0x2b, 0x0c, 0x00, 0x81, 0x5a, 0xbe,
0x14, 0x28, 0x12, 0x06, 0x07, 0x2b, 0x0c, 0x00, 0x82, 0x1d, 0x81, 0x48, 0xa0, 0x07, 0xa0, 0x05,
0x03, 0x03, 0x00, 0x08, 0x00 } },
{ "msg2", { 0x1, 0x2, 0x3 } },
{ "msg3", { 0x1, 0x2 } },
};

// what if key not found?
std::unordered_map<std::string, binary_message>::const_iterator it = table.find(key);
if (it != table.end())
return it->second;
//else
// ??? throw an exception? Something else? Or should I be returning a std::unordered_map<std::string, binary_message>::const_iterator?
}

int main()
{
const binary_message& msg7 = lookup_msg("msg1");

// do whatever with bytes

return 0;
}

最佳答案

这是 Boost.Optional 的一个很好的用例:

static boost::optional<const binary_message&> lookup_msg(const std::string& key) {
...
if (it != table.end()) {
return it->second; // we have a value
}
else {
return boost::none; // we do not have a value
}
}

这里的想法是返回类型本身知道它是否有值,没有歧义。

请注意,在这里返回迭代器并不是一个真正的选项,因为 table 是函数的静态局部变量 - 因此调用者没有任何东西可以与之进行比较。

关于c++ - 返回迭代器时,返回迭代器类型还是返回实际对象更好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33376463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com