Как лучше всего хранить список/вектор динамически созданных объектов?

Я всегда задавался этим вопросом, и сегодня я, наконец, настал момент, когда мне нужно получить правильный ответ.

А именно: я запутался, как мне хранить список/вектор/? динамически создаваемых объектов?

Например: у меня есть эта программа, которая будет читать из файла данные о соединениях, а затем на этой основе создавать объекты nodes (с информацией о соединении внутри него).

Итак, проблема в следующем: должен ли я использовать std::vector<node> и в цикле for создавать временные объекты и push_back() их или использовать указатели std::vector<node*> и push_back() динамически выделяемых node, а затем в конце программы удалять их?

У меня есть количество элементов, которые я хотел бы сохранить.

Или, может быть, есть лучший способ сделать это, и я не знаю об этом.


person Patryk    schedule 18.08.2012    source источник
comment
Являются ли эти узлы полиморфными? (т.е. базовые классы с виртуальными функциями и др.)   -  person R. Martinho Fernandes    schedule 19.08.2012
comment
((Можно ли подсчитать количество объектов по размеру файла?)) Ладно, неважно, я только что прочитал, что у вас есть число.   -  person Kuba Wyrostek    schedule 19.08.2012
comment
@R.MartinhoFernandes Они не полиморфны (но если вы ответите, пожалуйста, включите и это примечание), и я знаю количество элементов для хранения.   -  person Patryk    schedule 19.08.2012
comment
Если вам не нужен полиморфизм (или у вас есть веские причины для использования указателей), сохраняйте значения непосредственно в векторе.   -  person Cubic    schedule 19.08.2012


Ответы (3)


О, если у вас есть известный размер... выделите свой вектор с этим известным размером (чтобы исключить накладные расходы на изменение размера во время загрузки), тогда загрузка будет такой же эффективной, как memcpy(). Он просто соберет ваши значения, как и ожидалось. Очень эффективный, более эффективный, чем косвенный указатель.

Если ваши элементы полиморфны, вам понадобятся указатели. Если вы беспокоитесь об очистке памяти (вы должны быть обеспокоены), рассмотрите возможность использования: http://www.boost.org/doc/libs/1_50_0/libs/ptr_container/doc/ptr_vector.html

[ИЗМЕНИТЬ]

Если все имеет постоянный размер, рассмотрите также http://www.boost.org/doc/libs/1_50_0/doc/html/array.html. Это похоже на массив C, но без каких-либо накладных расходов на изменение размера и поддержки STL... если вам действительно нужна скорость.

person pestilence669    schedule 18.08.2012

Если вам абсолютно не требуется динамическое размещение, не используйте его.

person Puppy    schedule 18.08.2012
comment
Сам вектор является динамическим размещением. Вы имеете в виду избегать ручного выделения объектов node через new node? - person edA-qa mort-ora-y; 19.08.2012

Вы бы использовали std::vector<node> в этом сценарии.

Вы заранее знаете типы, размеры и количество элементов того, что вам нужно. То, что вы описываете, идеально подходит для вектора - вы имеете дело с непрерывным распределением.

В общем, использование std::list должно быть очень редким; вектор обычно является правильным выбором.

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

person justin    schedule 18.08.2012