Втори аргумент на std::vector

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

std::vector<int> myInts; // this is what I usually do
std::vector<int, ???> myOtherInts; // but is there a second argument there?

Като гледам линка по-горе пише, че е за:

Обект за разпределение, който да се използва вместо конструиране на нов.

или, както за този:

Разпределител: Тип на обекта за разпределение, използван за дефиниране на модела за разпределение на паметта. По подразбиране се използва шаблонът на класа на разпределителя за тип T, който дефинира най-простия модел за разпределение на паметта и е независим от стойността.

Предполагам, че е свързано с нещо с управлението на паметта. Не съм сигурен обаче как да го използвам.

Някакви насоки относно това?


person Default    schedule 14.12.2010    source източник
comment
Това е пример за дефиниране на вашия owm разпределител: stackoverflow. com/questions/3984588/c-stl-vector-reserve/   -  person    schedule 14.12.2010
comment
@skwllsp: това изглежда интересно. Искате ли да гласувам за или искате значката за невъзпят герой? :)   -  person Default    schedule 14.12.2010
comment
Забравих да добавя една точка. Използвал съм собствени разпределители, когато трябваше да намеря колко памет консумират моите контейнери. Написах за него малко дълъг отговор: stackoverflow.com/questions/2160300/   -  person    schedule 14.12.2010


Отговори (5)


Разпределителят по подразбиране, std::allocator<>, ще обработва всички разпределения, направени от std::vector<> (и други). Той ще прави нови разпределения от купчината всеки път, когато е необходимо ново разпределение.

Като предоставите персонализиран разпределител, можете например да разпределите голямо парче памет отпред и след това да го разделите и да раздадете по-малки части, когато са необходими отделни разпределения. Това ще увеличи драматично скоростта на разпределение, което е добре например в игрите, с цената на повишена сложност в сравнение с разпределителя по подразбиране.

Някои реализации от тип std имат вътрешно базирано на стек хранилище за малки количества данни. Например, std::basic_string<> може да използва това, което се нарича оптимизиране на малък низ, където само низове, по-дълги от определена фиксирана дължина, да речем 16 знака (само пример!), получават разпределение от разпределителя, в противен случай вътрешен използва се масив.

person Johann Gerell    schedule 14.12.2010
comment
но в std::vector<int>, ints не се ли оказват в стека? - person Default; 14.12.2010
comment
@По подразбиране - не. std::vector (по подразбиране) разпределя своето хранилище в купчина. - person atzz; 14.12.2010
comment
@По подразбиране: Моля, вижте моето допълнение относно оптимизирането на малки низове. - person Johann Gerell; 14.12.2010
comment
@Johann Gerell: благодаря. Това е най-добрият отговор досега, държа го отворен още малко, ако се появи още отговор. - person Default; 14.12.2010
comment
@Johann, @atzz: std::vector по подразбиране динамично разпределя своите елементи. Няма гаранция каква структура на данните използва това разпределение. - person Lightness Races in Orbit; 22.06.2011
comment
@Tomalak: Няма гаранция каква структура на данните използва това разпределение - казах ли, че има? - person Johann Gerell; 22.06.2011
comment
@Йохан: Да. Казахте купчина и купчина. - person Lightness Races in Orbit; 22.06.2011

Персонализираните разпределители рядко се използват в общия случай. Някои примери за това къде могат да бъдат полезни:

  • Оптимизация за конкретен модел на разпределения. Например, паралелна програма може предварително да разпредели голяма част от паметта чрез стандартни средства в началото на изпълнението на задачата и след това да отдели парчета от нея, без да блокира мютекса на глобалната купчина. Когато задачата е изпълнена, целият блок памет може да бъде изхвърлен. За да използвате тази техника със STL контейнери, може да се използва персонализиран разпределител.

  • Вграден софтуер, при който дадено устройство има няколко диапазона памет с различни свойства (кеширана/некеширана, бърза/бавна, летлива/постоянна и т.н.). Персонализиран разпределител може да се използва за поставяне на обекти, съхранени в STL контейнер в определен регион на паметта.

person atzz    schedule 14.12.2010
comment
Така че по принцип мога да го игнорирам, докато не трябва да се тревожа за управлението на паметта :) - person Default; 14.12.2010
comment
@Default - общо взето, да. От друга страна, може да се наложи да вземете предвид наличието на втори параметър, когато предавате шаблон на STL контейнер като параметър на шаблон на шаблон към друг шаблон. Но обикновено това също не е честа ситуация. :) - person atzz; 14.12.2010

Може би това ще помогне: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

Можете да опитате с Google за: stl allocator.

person Juraj Blaho    schedule 14.12.2010

Разпределителите (STL) ви помагат да управлявате паметта за вашия обекти във векторен клас. можете да използвате персонализирания разпределител за различен модел памет (и т.н.).

person Arseny    schedule 14.12.2010

Здравейте, можете да намерите пример за персонализиран разпределител http://www.codeproject.com/KB/cpp/allocator.aspx

person Sanja Melnichuk    schedule 14.12.2010