Предположим, что я пишу пользовательский вектор, используя std::allocator
, чтобы обернуть new
и delete
.Как использовать использование std :: allocator вместо realloc?
Когда количество элементов превышает емкость вектора, я хотел бы перераспределить буфер на нечто большее. Я могу легко достичь этого, позвонив по телефону realloc()
. Я не хочу этого делать, потому что я думал, что ответственность за распределение/освобождение должна находиться в распределителе.
Однако, глядя на интерфейс std::allocator
, я не вижу, как я мог бы перераспределить. Есть только методы:
T* allocate(std::size_t n);
void deallocate(T* p, std::size_t n);
Должен ли я называть allocator::allocate
, а затем allocator::deallocate
вместо того, чтобы просто realloc
? Это так же эффективно? Это должно быть то, что делает std::vector
. Почему std::allocator
не предоставляет функцию reallocate
?
_ «Почему std :: allocator не предоставляет функцию перераспределения?» _ Это частично рассматривается в [этом вопросе] (http://stackoverflow.com/questions/3105001/why-is-there-no-reallocation -functionality-в-с-распределители? RQ = 1). – ArchbishopOfBanterbury
[FYI] https://isocpp.org/wiki/faq/freestore-mgmt#realloc-and-renew – NathanOliver
@NathanOliver. Он заканчивается тем, что «на C++ лучший способ справиться с перераспределением - использовать стандартный контейнер библиотеки , например, вектор, и пусть он растет естественным образом ». Это является отправной точкой для этого вопроса ... –