静态向量的初始化

Xir*_*dus 39 c++ static-members stdvector

我想知道是否存在初始化静态向量的"更好"方式而不是下面的方法?

class Foo
{
    static std::vector<int> MyVector;
    Foo()
    {
        if (MyVector.empty())
        {
            MyVector.push_back(4);
            MyVector.push_back(17);
            MyVector.push_back(20);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个示例代码:)

push_back()中的值是独立声明的; 不是数组或其他东西.

编辑:如果不可能,告诉我也:)

Mik*_*our 48

在C++ 03中,最简单的方法是使用工厂函数:

std::vector<int> MakeVector()
{
    std::vector v;
    v.push_back(4);
    v.push_back(17);
    v.push_back(20);
    return v;
}

std::vector Foo::MyVector = MakeVector(); // can be const if you like
Run Code Online (Sandbox Code Playgroud)

"返回值优化"应该意味着数组已填充到位,如果需要考虑,则不进行复制.或者,您可以从数组初始化:

int a[] = {4,17,20};
std::vector Foo::MyVector(a, a + (sizeof a / sizeof a[0]));
Run Code Online (Sandbox Code Playgroud)

如果您不介意使用非标准库,可以使用Boost.Assignment:

#include <boost/assign/list_of.hpp>

std::vector Foo::MyVector = boost::list_of(4,17,20);
Run Code Online (Sandbox Code Playgroud)

在C++ 11或更高版本中,您可以使用大括号初始化:

std::vector Foo::MyVector = {4,17,20};
Run Code Online (Sandbox Code Playgroud)

  • 新语言功能+1(统一初始化语法ftw). (3认同)

Tod*_*ner 28

通常,我有一个用于构造我使用的容器的类(如boost中的这个),这样你就可以:

const list<int> primes = list_of(2)(3)(5)(7)(11);
Run Code Online (Sandbox Code Playgroud)

这样,你也可以制作静态const,以避免意外修改.

对于静态,您可以在.cc文件中定义它:

// Foo.h

class Foo {
  static const vector<int> something;
}

// Foo.cc

const vector<int> Foo::something = list_of(3)(5);
Run Code Online (Sandbox Code Playgroud)

在C++ Ox中,我们将使用语言机制来执行此操作,使用初始化列表,因此您可以这样做:

const vector<int> primes({2, 3, 5, 7, 11});
Run Code Online (Sandbox Code Playgroud)

看到这里.


syv*_*vex 20

使用C++ 11:

std::vector<int> Foo::MyVector = {4, 17, 20};
Run Code Online (Sandbox Code Playgroud)