c ++: std :: vector из std :: vector внутри структуры - PullRequest
2 голосов
/ 10 апреля 2020

Мне нужно создать структуру, которая получает std::vector<std::vector<int>>, которая будет содержать 4 вектора целых. Я попробовал объявление, которое я обычно использую для вектора векторов:

struct myStruct{
   std::vector<std::vector<int>> myVector(4);
};

, но при компиляции я получаю эту ошибку:

myProgram.cpp:79:52: error: expected identifier before numeric constant
     std::vector<std::vector<int>> myVector(4);
                                           ^
myProgram.cpp:79:52: error: expected ‘,’ or ‘...’ before numeric constant

Я пытался объявить вектор в структуре а затем зарезервируйте 4 элемента в main () следующим образом:

struct myStruct{
   std::vector<std::vector<int>> myVector;
};

int main(){
   myStruct s;
   s.myVector.reserve(4);
   s.myVector[0].push_back(1);
   return 0;
}

Таким образом, он компилируется без ошибок, но я получаю нарушение сегментации, как только я пытаюсь push_back.

Как правильно выполнить эту задачу? И почему я не могу использовать первое объявление, чтобы указать размер myVector? Спасибо! :)

Ответы [ 2 ]

3 голосов
/ 10 апреля 2020

Инициализатор члена по умолчанию внутри класса или структуры должен иметь = токен и / или { фигурные скобки }.

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;
}
1 голос
/ 10 апреля 2020
struct myStruct {
    std::vector<std::vector<int>> myVector{4};
};

int main() {
    myStruct s;
    s.myVector[0].push_back(1);
    s.myVector[0].push_back(2);
    s.myVector[0].push_back(3);
    s.myVector[0].push_back(4);

    s.myVector[1].push_back(11);
    s.myVector[1].push_back(21);
    s.myVector[1].push_back(31);
    s.myVector[1].push_back(41);

    cout << s.myVector[0][0] << " " << s.myVector[0][1] << " " << s.myVector[0][2] << " " << s.myVector[0][3] << " " << endl;
    cout << s.myVector[1][0] << " " << s.myVector[1][1] << " " << s.myVector[1][2] << " " << s.myVector[1][3] << " " << endl;

    return 0;
}

Как правильно выполнить эту задачу?

Надеюсь, это ответит на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...