Инициализатор члена по умолчанию внутри класса или структуры должен иметь =
токен и / или {
фигурные скобки }
.
std::vector<std::vector<int>> myVector{4};
[Обратите внимание, что было бы сложнее, если бы тип был просто std::vector<int>
, поскольку фигурные скобки для vector
подразумевают последовательность элементов. std::vector<int>{4}
- это вектор с размером один, чей единственный элемент равен 4
, а не вектор из четырех нулей. Но здесь все хорошо, потому что {4}
не может преобразоваться в std::initializer_list<std::vector<int>>
, поэтому перегрузка конструктора недопустима, а конструктор vector(size_type)
победит.]
В примере программы поведение не определено, поскольку reserve
не изменяет размер и не создает элементы . Так что s.myVector[0]
недопустимо, поскольку вектор все еще пуст. Помните, reserve
- это просто подсказка для вектора. Любая действительная программа, использующая reserve
, все равно будет действительной, если вы удалите все reserve
вызовы.
Использование resize
вместо этого будет делать то, что вы, похоже, имеете в виду: сделать размер myVector
равным 4, создав 4 пустых вектора элементов. Затем push_back
добавит число 1 к первому из этих векторов, что приведет к данным {{1}, {}, {}, {}}
.
int main(){
myStruct s;
s.myVector.resize(4);
s.myVector[0].push_back(1);
return 0;
}