我想知道是否存在初始化静态向量的“更好”方式而不是下面的方法?
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()中的值是独立声明的;不在数组或其他东西。
编辑:如果不可能,请告诉我:)
答案 0 :(得分:47)
在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};
答案 1 :(得分:27)
通常,我有一个用于构建我使用的容器的类(如来自boost的this one),这样你就可以这样做:
const list<int> primes = list_of(2)(3)(5)(7)(11);
这样,您也可以制作静态const,以避免意外修改。
对于静态,您可以在.cc文件中定义:
// Foo.h
class Foo {
static const vector<int> something;
}
// Foo.cc
const vector<int> Foo::something = list_of(3)(5);
在C ++ Ox中,我们将使用语言机制来执行此操作,使用初始化列表,因此您可以这样做:
const vector<int> primes({2, 3, 5, 7, 11});
请参阅here。
答案 2 :(得分:19)
使用C ++ 11:
std::vector<int> Foo::MyVector = {4, 17, 20};
答案 3 :(得分:2)
你可以尝试这个:
int arr[] = { 1,2,3,4,5,6,7,8,9 };
MyVector.insert(MyVector.begin(), arr, &arr[sizeof(arr)/ sizeof(*arr)]);
但是,当你拥有一个非常长的矢量时它可能是值得的,而且看起来也不是很好。但是,你摆脱了重复的push_back()调用。当然,如果你的值“不在数组中”,你必须首先将它们放在那里,但你可以静态地(或者至少是引用/指针),这取决于上下文。
答案 4 :(得分:1)
如何使用静态对象进行初始化。在它的构造函数中 可以调用对象中的静态函数来进行初始化。
答案 5 :(得分:0)
使用boost可以使用boost :: assign命名空间中定义的+ =()运算符。
#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,请使用初始化列表。