[英]How to initialize a static vector array member in 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
是否有可能做到这一点?
您需要使用初始化列表在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;
解决方法是添加一个内部静态类_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。
看起来意图更像是:
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实例。 遍历vec时可以显示,上面的OP中传递一个空Point的最后一行没有任何作用。 第三个元素(索引为2)将不会打印任何内容。 已添加{4,5} 点以测试遍历vec的所有索引。 注意,push_back调用中有两组花括号。 如果没有外部花括号,则编译器错误将指出:“没有匹配的成员函数可调用push_back。”
遍历多维矢量(例如矩阵或数组)的示例代码:
//
// 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(或的范围)。
有关多维矢量的更多参考,请参见多维矢量,如何论坛发布。
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)}, {}};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.