Jak używać construct z alokatorów, gdy nie chcę wołać konstruktora kopiującego

0

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 ;)

0

Alokator to taki malloc, on alokuje, a nie konstruuje. Konstruuj za pomocą placement new.

Prawdziwa zabawa Cię czeka, gdy weźmiesz pod uwagę fakt, że przy zmianie wielkości konstruktor przenoszący może rzucić wyjątek.

0
kq napisał(a):

Alokator to taki malloc, on alokuje, a nie konstruuje. Konstruuj za pomocą placement new.

No nie do końca alokator tylko alokuje. Alokator wg dokumentacji ma następujące metody:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0);//alokuje (np malloc albo new char[n*sizeof(value_type)])
void construct ( pointer p, const_reference val );//konstruuje czyli placement new

Postanowiłem że na razie (o ile nie znajdę lepszego sposobu, lub mi ktoś nie podpowie) dodam nową metodę do alokatora np

 
void construct ( pointer p);//bez const_reference val i będę wołał konstruktor domyślny

1 użytkowników online, w tym zalogowanych: 0, gości: 1