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;
vec[0] = { {1,2}, {3,4}};
Это не будет работать, поскольку нет конструктора векторов, который принимает переменное количество объектов (работает в С++ 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 для построения вектора.
В С++ 11, я думаю, вы можете сделать это следующим образом:
vector<Point> Foo::vec[] = {{Point(1,2), Point(3,4)}, {Point(0,0)}, {}};
Обходной задачей будет добавление внутреннего статического класса _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;
Если это так, то с некоторым коротким тестированием в С++ 11, 64-битной С++ Builder для Windows и компиляцией, которая получает желаемый результат. В качестве дополнительного эксперимента после определения конструкторов с параметром-меньше и переданного значения для типа Point (class?), Используемого в этом примере, также вызывает вызов push_back на многомерном vec:
vec.push_back( {{1,2}, {3,4}} );
vec.push_back( {{0,0}} );
vec.push_back( {{4,5}} );
Я уверен, что причиной того, что классом Point можно пренебречь, является то, что многомерный вектор vec был объявлен для хранения экземпляров Point. Последняя строка в 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 (или диапазон для).
Дополнительную ссылку на многомерный вектор см. В многомерном векторе, как размещать на форуме.