Witam
W celach edukacyjnych piaszę sobie własną implementację std::vector. Sądziłem że będzie trywialne. Tymczasem nie jest.
Wszystko byłoby proste, gdyby nie metoda reserve - rezerwowanie pamięci bez konstruowania obiektów.
W tym momencie mój prototyp wygląda tak:
void Vector::reserve(size_type n)
value_type *newData = _allocator.allocate(n);
for(size_type i = 0; i < _size; ++i){
_allocator.construct(newData[i], _data[i]);
//tu destruktory na starych obiektach i na _data itp
_data = newData;
Jak widać _allocator.construct wola konstruktor kopiujący, z poprzednią wartością umieszczoną w data[i]. Tak ma być.
Ale jak mam z tym wszystkim powiązać funkcję resize()?
Np resize(3) podczas gdy było 2.
std::vector zawoła 2 razy konstruktor kopiujący (ok - ja też - użyję alokatora),
i raz konstruktor bezargumentowy - i tego nie umiem.
Jak to jest implementowane? Mogę przeciążyć construct w moim alokatorze, tak by druga wersja wołała konstruktor bezargumentowy ale wtedy to nie będzie standardowy alokator.
Jakieś inne pomysły? Help ;)