На трех указателях ясно, но ни как не могу придумать как реализовать вектор на одном указателе, не задействовав для хранение оставшихся двух указателей выделенную память. Но говорят такой вариант есть.
Возможно "Pointer to implementation":
template<class T>
class MyVector
{
public:
MyVector()
: data(0)
{
}
~MyVector()
{
for (int i = 0; i < data->size; ++i) {
data[i].~T()
}
}
void resize(size_t new_size)
{
struct AlignedData : public Data // структура для правильного учета выравнивания
{
T dummy_object;
};
void * new_data_mem = malloc(sizeof(AlignedData) + sizeof(T) * (new_size-1));
Data * new_data = new(new_data_mem) Data;
new_data->mem = &(static_cast<AlignedData*>(new_data_mem)->dummy_object);
// либо перемещение старых
for (auto i = 0; i < old_size; ++i) {
new (&new_data->mem[i]) T(std::move(data->mem[i])); // <- перемещаем элемент в новую память
}
// либо инициализация новых элементов
for (auto i = old_size; i < new_size; ++i) {
new (&new_data->mem[i]) T; // <- инициализация элементов массива
}
// либо удаление лишних элементов
for (auto i = new_size; i < old_size; ++i) {
new_data->mem[i].~T();
}
data = new_data;
}
private:
Data
{
size_t size;
size_t capacity;
T * mem;
};
Data * data; // <== один указатель
};
Тут только идея. Возможны ошибки в синтаксисе и нет проверок ошибок и прочего.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости