Вектор списков

0

Поэтому я пытаюсь написать функцию, которая принимает два аргумента: list<item> myList и int num_items и создает вектор новых списков. Каждый элемент имеет идентификатор элемента данных, который является индексом в векторе, из которого должен быть добавлен элемент. Идентификатор любого элемента гарантированно не больше (num_items - 1). Вот мой код:

vector<list<item>> createVector(list<item> myList, int num_items) {
   vector<list<item>> myVector;
   myVector.reserve(num_items);

   for(item& i : myList)
      myVector[i.ID].push_back(i);

   return myVector;
}

Это вызывает ошибку сегментации всякий раз, когда я пытаюсь вызвать push_back(), чтобы добавить элемент в список в векторе. Я знаю, как реализовать эту функцию с помощью указателей, однако тип, возвращаемый функцией, должен быть фактическим вектором списков, не являющихся указателями на них, поэтому я не могу использовать распределение динамической памяти. Любая помощь будет принята с благодарностью. Благодарю.

Теги:
list
vector

2 ответа

3

reserve() просто выделяет блок памяти. Он не создает объекты list которые вы вызываете push_back(). Для их создания необходимо использовать resize() вместо reserve():

myVector.resize(num_items);

Или лучше, переведите счетчик непосредственно в конструктор:

vector<list<item>> myVector(num_items);
0

reserve только пространство для этого множества векторных элементов; он не создает никаких элементов, поэтому вы не можете получить к ним доступ. Вы хотите использовать resize (или просто передать размер как аргумент конструктора), чтобы заполнить вектор допустимыми пустыми списками.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню