通过引用返回空向量

4

我正在返回一个向量的引用,如下所示,当映射中没有项目时,如果要返回一个空向量,它会变得有些丑陋。以下内容会发出警告(returning address of local variable),为了修复它,我有另一个私有成员变量vector<ClassA> empty_,我可以返回它以避免这种情况。

我想知道是否有更优雅的实现方式。

const std::vector<ClassA>& GeVector(const std::string& class_id) {
auto iter = class_map_.find(class_id);
if (iter != class_map_.end())
    return iter->second;
return {}; // return empty_;
}

private:
std::unordered_map<std::string, std::vector<ClassA>> class_map_;
vector<ClassA> empty_;

1
你的 empty_ 是一种优雅的实现方式。为了保险起见,可以将其设为静态。 - SergeyA
返回一个指针,它可以是 nullptr - john
@john nullptr不起作用。编译失败。 - RedFox
1
@RedFox 注意第一句话。 - eerorika
警告是正确的 - 您返回对局部变量的引用,该变量将在函数调用后停止存在。您的本地 empty_ 是一个不错的解决方案。该函数也可以抛出异常或返回指针而不是引用(编译失败不是阻碍因素)。 - ilya1725
2个回答

9
你可以使用静态变量:
```

你可以使用静态变量:

```
static const std::vector<ClassA> empty;
return empty;

静态函数作用域变量会带来一点性能损耗(很小)。类级别的静态变量没有这个缺点。 - SergeyA
@SergeyA 但是类级别的静态变量会受到静态初始化顺序混乱的影响。 - eerorika
不是在这种情况下。 - SergeyA
@SergeyA 好的,提供的代码没有任何作用,因为 GeVector 从未被调用。但这只是一个例子。如果从另一个 TU 中定义的静态对象的初始化中调用了 GeVector,则初始化顺序将是未指定的。对于本地静态变量来说不是问题。 - eerorika
就像我所说的一样 - 这将会影响性能。最好的解决方案是实际使用初始化保护,就像 std::cout 使用的那样。这在这里可能会被认为是过度杀伤力了。 - SergeyA
显示剩余2条评论

3
如果您的方法支持失败选项,可以抛出一个异常而不是返回一个空向量。
const std::vector<ClassA>& GeVector(const std::string& class_id) {
    auto iter = class_map_.find(class_id);
    if (iter != class_map_.end())
       return iter->second;

    throw std::exception("Element not found"); // or similar
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接