繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM