2010-09-13 167 views
27

我想知道是否存在初始化静态向量比下面更好的“更好的”方法?初始化静态向量

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

这是一个示例代码:)

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

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

+3

希望看到C++ 0x的人会说什么。我认为类定义之外的东西像Foo :: MyVector {4,17,20}是可能的。 – 2010-09-13 15:36:17

回答

25

通常情况下,我有了一个修建,我使用(像this one从boost)的容器,这样你可以做一个类:

const list<int> primes = list_of(2)(3)(5)(7)(11); 

这样,您也可以使静态常量,以避免意外修改。

对于静态的,你可以在.cc文件定义的:

// Foo.h 

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

// Foo.cc 

const vector<int> Foo::something = list_of(3)(5); 

在C++牛年,我们将有一个语言机制要做到这一点,使用初始化列表,所以你可以只请执行以下操作:

const vector<int> primes({2, 3, 5, 7, 11}); 

请参阅here

+0

我猜如果他强调这些值“不在数组中”,那么这个新功能也不会有太大的好处。我猜想,要么让他们进入某种收藏或与重复插入电话一起生活是没有办法的。 – 2010-09-13 15:52:26

+0

我认为list_of是我需要的。它看起来很简单,我认为,比多个push_back更快。当我说“他们不在阵列中”时,我没有提到他们不能在一个。 – Xirdus 2010-09-13 16:05:22

+0

最有可能的是,它内部使用多个push_back(),所以在这个意义上它不是“更快”。它确实避免了构造函数中的条件,这会使速度更快。但是,静态初始化可能不是您的代码花费大部分时间的地方,因此优化这些部分很可能不会引起明显的增益收益。 – 2010-09-13 17:13:40

2

你可以试试这个:

int arr[] = { 1,2,3,4,5,6,7,8,9 }; 
MyVector.insert(MyVector.begin(), arr, &arr[sizeof(arr)/ sizeof(*arr)]); 

但它可能是唯一值得当你有一个很长的矢量,它不看更漂亮,无论是。但是,您摆脱了重复的push_back()调用。当然,如果你的值“不在数组中”,你必须首先将它们放到那里,但是根据上下文,你可以静态地(或者至少是引用/指针)。

40

在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 

“返回值优化”应指的是阵列填充的地方,而不是复制的,如果这是一个关心。或者,你可以从一个数组初始化:

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

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

#include <boost/assign/list_of.hpp> 

std::vector Foo::MyVector = boost::list_of(4,17,20); 

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

std::vector Foo::MyVector = {4,17,20}; 
+2

+1新语言功能(统一初始化语法ftw)。 – rubenvb 2010-09-13 19:46:05

+0

这个函数是个坏主意,因为只会有一个静态向量来填充。 – Xirdus 2010-09-14 16:26:26

+0

@ Xirdus:是什么让它成为一个坏主意?如果你需要初始化一个非空数组,那么这是一种方法。 – 2010-09-14 17:09:56

1

如何使用静态对象初始化。在其构造函数中,它可以调用对象中的静态函数来执行初始化。

+4

请详细说明或举例。 – 2012-09-18 04:12:53

+0

只用一个构造函数创建一个类声明,其中您将一个值(或多个值)push_back到全局/静态向量中。然后创建该类的静态实例 - >构造函数将在main之前调用,并且静态向量将被填充。该实例不会构成任何内存开销,因为它不包含任何成员变量。 (在你的cpp文件中使用一个未命名的命名空间来声明/定义/实例化助手类) – 2016-06-01 19:56:34

15

用C++ 11:

std::vector<int> Foo::MyVector = {4, 17, 20}; 
0

与升压可以使用在升压::分配名称空间中定义的+ =()运算符。

#include <boost/assign.hpp> 

using namespace boost::assign; 

int main() 
{ 
    static std::vector<int> MyVector; 
    MyVector += 4,17,20; 
    return 0; 
} 

或静态初始化:

#include <boost/assign.hpp> 

using namespace boost::assign; 

static std::vector<int> myVector = list_of(4)(17)(2); 

int main() 
{ 
    return 0; 
} 

,甚至更好,如果你的编译器支持C++ 11,使用初始化列表。

+0

我可以做这个“静态”类成员吗? – ThomasMcLeod 2013-10-11 17:51:55

+0

C++ 11为此设置了初始化列表,或者您可以使用结构而不是类,并静态初始化它们MyStruct val = {1,2,3}。否则,对于私人类成员,您必须使用构造函数。 – 2013-10-27 21:49:02