Поэтому я пытаюсь написать функцию, которая принимает два аргумента: 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(), чтобы добавить элемент в список в векторе. Я знаю, как реализовать эту функцию с помощью указателей, однако тип, возвращаемый функцией, должен быть фактическим вектором списков, не являющихся указателями на них, поэтому я не могу использовать распределение динамической памяти. Любая помощь будет принята с благодарностью. Благодарю.
reserve()
просто выделяет блок памяти. Он не создает объекты list
которые вы вызываете push_back()
. Для их создания необходимо использовать resize()
вместо reserve()
:
myVector.resize(num_items);
Или лучше, переведите счетчик непосредственно в конструктор:
vector<list<item>> myVector(num_items);
reserve
только пространство для этого множества векторных элементов; он не создает никаких элементов, поэтому вы не можете получить к ним доступ. Вы хотите использовать resize
(или просто передать размер как аргумент конструктора), чтобы заполнить вектор допустимыми пустыми списками.