Кой е най-добрият начин за съхраняване на списък/вектор от динамично създадени обекти?

Винаги съм се чудил за това и днес най-накрая стигнах до момент, в който трябва да получа правилния отговор.

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

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

Така че проблемът е: трябва ли да използвам std::vector<node> и в for цикъл да създам временни обекти и push_back() тях или да използвам std::vector<node*> и push_back() указатели на динамично разпределени nodes и след това в края на програмата да ги изтрия?

Имам броя на елементите, които бих искал да съхраня.

Или може би има по-добър начин да направите това, но аз не знам за него.


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