class Foo{
static vector<Point> vec[3];
};
所以我有一個三個向量的數組。我需要在編譯時初始化每個向量。如何初始化C++中的靜態向量數組成員
例如東西,看起來像這樣:
vec[0] = { {1,2}, {3,4}}; // contain two points
vec[1] = { {0, 0}}; // contain one point
vec[2] = {}; // empty
是否有可能做到這一點?
class Foo{
static vector<Point> vec[3];
};
所以我有一個三個向量的數組。我需要在編譯時初始化每個向量。如何初始化C++中的靜態向量數組成員
例如東西,看起來像這樣:
vec[0] = { {1,2}, {3,4}}; // contain two points
vec[1] = { {0, 0}}; // contain one point
vec[2] = {}; // empty
是否有可能做到這一點?
您需要使用intialization列表
在cpp文件宣佈它在cpp文件:
vector<Poiint> Foo::vec={Point(1,2,3), Point(4,5,6), Point(8,9,10)};
其中點(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'
因此,初始化器的構造函數將被調用來初始化欄。
它看起來像用意更像是:
static vector < vector<Point> > vec;
如果是這樣,那麼用在C++ 11,Windows 64位C++ Builder的編譯和運行,一些短期測試獲得期望的結果。 (?類)作爲附加實驗,定義爲點參數少,並通過價值構造後鍵入本例中使用,在多維VEC作品調用的push_back還有:
vec.push_back({{1,2}, {3,4}});
vec.push_back({{0,0}});
vec.push_back({{4,5}});
我相信的理由點類可以忽略是因爲多維vec矢量已被聲明爲存儲點實例。上面的OP中傳遞一個空點的最後一行並沒有達到任何效果,正如遍歷vec時可以看到的那樣。第三個元素(索引二)不會打印一個東西。已經添加了{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(或者範圍)。
有關多維向量的其他參考,請參見multidimensional vector, how to論壇發帖。
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>()};
它使用矢量構造函數的開始和結束迭代器來構建其載體。
在C++ 11,我想你可以這樣來做:
vector<Point> Foo::vec[] = {{Point(1,2), Point(3,4)}, {Point(0,0)}, {}};
謝謝你的提示,但我的意思是有三個矢量(如數組),而不是一個:) – Diaz