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
是否可以这样做?
答案 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)}, {}};