O inicializaci a správu paměti se stará
std::vector sám (přesněji to dělá jeho alokátor, který můžete nahradit za vlastní, ale ten výchozí v naprosté většině případů stačí). Pro rozšiřování má metodu
insert(int, const Data&) a dvě „zkratky“
push_front(const Data&) a
push_back(const Data&) (v C++11 mají všechny tyhle metody ještě přetíženou verzi pro přesouvání).
insert předaná data zkopíruje dovnitř
std::vectoru pomocí kopírovacího konstruktoru, takže původní instance sice zanikne, ale její kopie tam bude. C++11 řeší výkon pomocí těch přesouvacích verzí, které volají přesouvací konstruktory, když ten objekt má stejně zaniknout. V C++ před-11 tohle není, takže se to u paměťově náročných tříd řeší tak, že se pomocí
insert vloží prázdný objekt a až s tím se pracuje; u paměťově jednoduchých objektů se na to kašle v obou verzích
insert vrátí iterátor na vložený objekt (
push_front ani
push_back to nedělají, ale vložené objekty lze získat pomocí metod
front() a
back()), takže lze udělat něco podobného:
Data &data = *vector.insert(vector.size(), Data());
data.allocateALotOfMemory();
Případně můžete využít metodu
resize(int, const Data& = Data()), která „roztáhne“ (nebo „scvrkne“) ten vektor a nové prvky vytvoří kopírováním předaného prvku:
vector.resize(vector.size() + 1);
Data &data = vector.back();
data.allocateALotOfMemory();
Pokud chcete postupně naplnit vektor o délce
n, je nejlepší jej předalokovat najednou a až potom plnit, vyhnete se různých výkonostních problémů s kopírováním:
vector.resize(n);
for (std::vector<Data>::iterator it = vector.begin(), end = vector.end(); it != end; ++it) {
it->allocateALotOfMemory();
}
Pozn. tohle všechno se týká C++ před-11; v C++11 by to bylo trochu jednodušší
