【问题标题】:return empty vector by reference通过引用返回空向量
【发布时间】:2019-06-11 00:56:00
【问题描述】:

我通过引用返回一个向量,如下所示,当我想在地图中没有项目时返回一个空向量时,它变得有点难看。下面给出警告 (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_;

【问题讨论】:

  • 您的empty_ 是一种优雅的方式。可以使其静态化。
  • 返回一个指针,可以是nullptr
  • @john nullptr 不起作用。编译失败。
  • @RedFox 注意第一句话。
  • 警告是正确的 - 您返回对局部变量的引用 tat 在函数调用后将不复存在。您当地的empty_ 是一个不错的解决方案。该函数还可以抛出异常或返回指针而不是引用(编译失败不是阻塞器)

标签: c++ c++11 dictionary vector


【解决方案1】:

你可以使用静态变量:

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

【讨论】:

  • 静态函数范围变量承受(微小的)性能损失。类级静态没有这个缺点。
  • @SergeyA 但类级静态遭受静态初始化顺序失败。
  • 在这种情况下不是。
  • @SergeyA 为什么不呢?
  • 好的,我应该改写它 - 不是提供的代码。
【解决方案2】:

如果您的方法支持失败选项,您可以抛出异常而不是返回空向量。

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-07
    • 2019-05-06
    • 2014-06-07
    • 2020-06-18
    • 1970-01-01
    • 2012-07-17
    • 2020-02-06
    • 2018-07-27
    相关资源
    最近更新 更多