【问题标题】:A function that always returns the same vector总是返回相同向量的函数
【发布时间】:2015-08-03 22:07:02
【问题描述】:

我正在尝试编写一个返回向量的实用函数。返回的向量将始终具有相同的条目。我正在使用它来过滤枚举 (Directions),以便客户端可以获得所需的子集。

这是我希望如何解决问题的示例:

std::vector<Directions> horizontalDirections()
{
    static std::vector<Directions> toReturn;
    if (toReturn.size() == 0)
    {
        toReturn.push_back(Left);
        toReturn.push_back(Right);
    } 
    return toReturn;
}

这是正确的做法吗?

【问题讨论】:

  • 在某些情况下,向量可能非常大。这就是为什么我想避免在不需要时将所有内容都推入向量中。
  • 您可以通过引用返回const vector

标签: c++ function static


【解决方案1】:

您的工作方式。但我会返回一个const 引用,以便在不需要时避免复制:

const std::vector<Directions>& horizontalDirections();

另外,如果您使用的是 C++11,您的实现可以缩写为:

const std::vector<Directions>& horizontalDirections()
{
    static std::vector<Directions> toReturn({Left, Right});
    return toReturn;
}

如果使用 C++11,您可以更进一步,将 horizontalDirections 声明为全局 const vector 而不是函数:

const std::vector<Directions> horizontalDirections({Left, Right});

【讨论】:

  • 请注意,全局对象版本可能会导致静态初始化订单惨败。 (函数版本只能参与破坏令惨败。)
【解决方案2】:

这基本上是正确的想法。我会通过引用返回以避免复制向量。您可以使用 C++11 初始化列表样式使正文更加清晰:

const std::vector<Directions>& horizontalDirections() {
    static const std::vector<Directions> toReturn = {
        Left,
        Right
    };
    return toReturn;
}

【讨论】:

  • 额外的好处是,如果有问题,您可以免费获得线程安全。静态变量的初始化是线程安全的,稍后更改它们(即推入它)不会。如果多线程有任何问题,那么静态变量总是值得考虑的。
【解决方案3】:

我根本不会把它作为一个函数来做,而是作为一个像这样在全局范围内的常量:

const std::vector<Direction> horizentalDirections = {Left, Right};

这就是常量的用途。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多