如何在C ++中初始化静态向量数组成员

时间:2014-03-18 23:14:45

标签: c++

class Foo{
static vector<Point> vec[3];
};

所以我有一个三个向量的数组。我需要在编译时初始化每个向量。

例如,看起来像这样:

vec[0] = { {1,2}, {3,4}}; // contain two points
vec[1] = { {0, 0}};       // contain one point
vec[2] = {};              // empty

是否可以这样做?

4 个答案:

答案 0 :(得分:1)

您需要使用初始化列表

在cpp文件中声明它

在cpp文件中:

vector<Poiint> Foo::vec={Point(1,2,3), Point(4,5,6), Point(8,9,10)};

其中Point(x,y,z)是构造函数,因此它将使用三个元素填充向量

在课堂上你应该这样声明:

static vector<Point> vec;

答案 1 :(得分:0)

解决方法是添加一个内部静态类_init(按照你喜欢的方式命名),其构造函数执行实际的初始化。

Class Foo{
public:
static int bar;
static class _init{
 public _init(){// do something to bar}
} Initializer;
};

// --- in .cpp
// define 'bar' and 'Initializer'

这样将调用Initializer的构造函数来初始化bar。

答案 2 :(得分:0)

看起来意图更像是:

static vector < vector<Point> > vec;


如果是这样,那么在C ++ 11,Windows 64位C ++ Builder编译和运行中进行一些简短测试,即可获得所需的结果。作为一个额外的实验,在为示例中使用的Point(class?)类型定义无参数和传递值构造函数之后,在多维vec上调用push_back也是有效的:

vec.push_back( {{1,2}, {3,4}} );
vec.push_back( {{0,0}} );
vec.push_back( {{4,5}} );

我确信 Point 类可以忽略的原因是因为多维 vec 向量已声明存储 Point 实例。传递空Point的OP中的最后一行没有达到任何效果,如遍历vec时所示。第三个元素(索引二),不会打印一个东西。添加了{4,5} Point 以测试遍历vec的所有索引。请注意,push_back调用中有两组花括号。如果没有外部的花括号,编译器错误会显示,&#34;没有匹配的成员函数来调用push_back。&#34;

遍历多维向量的示例代码(例如矩阵或数组):

//
// Declared a typedef to separate the vector row and the whole matrix
// Makes it simpler to traverse each vector row later.  intVals is a 
// test class with public integer elements "a" and "b".  The intVals
// class substitutes for the Point type in the OP above.
//
typedef vector<intVals> vec_t;
vector<vec_t> matrix;


int jj;
for (int i = 0; i < 3; i++)
{  
   jj = 0;
   for (vec_t::iterator j = matrix[i].begin(); j != matrix[i].end(); j++)
   {
      cout << "Matrix at index: " << i << ", element: " << jj << " a = " << (*j).a;
      cout << " b = " << (*j).b << endl;
      jj++;
   }
}                                                  


请注意,外环夹在三处。真正的实现可以使用matrix :: iterator(或者是一个范围)。

有关多维向量的其他参考,请参阅multidimensional vector, how to论坛发帖。

答案 3 :(得分:0)

    vec[0] = { {1,2}, {3,4}};

由于没有可以使用可变数量对象的向量构造函数(在C ++ 11中支持initializer_list),因此无法工作。

要解决这个问题,你可以使用几个数组来实现这个目标:

    Point v1[2] = {Point(1,2), Point(3,4)};
    Point v2[1] = {Point(0.0)}; 

vector<Point> Foo::vec[] = {vector<Point>(v1, v1+2), vector<Point>(v2, v2+1), vector<Point>()};

这使用了带有begin和end迭代器的向量构造函数来构造向量。

在C ++ 11中,我认为你可以这样做:

    vector<Point> Foo::vec[] = {{Point(1,2), Point(3,4)}, {Point(0,0)}, {}};