Нужно ли изменять размер std :: vector, если содержащиеся в нем элементы увеличиваются в размере? - PullRequest
1 голос
/ 12 июля 2019

Я прошу прощения, если это слишком простой вопрос, чтобы задать его здесь;Я читал немного о std :: vector, и я понимаю, что он должен изменить размер, когда размер достигает емкости.Это может быть дорогостоящей операцией, если содержащиеся в ней объекты большие, так как она должна копировать каждый из них.

Мой вопрос: как std :: vector обрабатывает фактический размер объектов, которые он содержит?Предположим, что я инициализирую некоторые

std::vector<Obj> vec(100);

И каждый объект Obj инициализируется чем-то очень маленьким.Но что, если я тогда сделаю что-то вроде

vec[14].ENGORGIO()

, так что теперь это занимает гораздо больше памяти.Поскольку элементы std :: vector хранятся в смежной памяти, означает ли это, что он должен изменить размер (дорого!)

Чтобы избежать подобных вещей, я должен вместо этого хранить указатели в векторе, а несами объекты?Вот так

std::vector< std::unique_ptr<Obj> > vec;

Спасибо

Ответы [ 2 ]

2 голосов
/ 12 июля 2019

Размер типа данных в C ++ устанавливается во время компиляции и не может изменяться. Тип данных может содержать ссылки на другие объекты, и эти другие объекты могут различаться по размеру, но размер ссылки и, следовательно, тип данных не меняется.

Рассмотрим vector из vector с. Внутренний vector может содержать 0 элементов или миллиарды и миллиарды, и он всегда будет одного размера. Внешний vector знает только то, что он содержит 0 или более vector с, и ничего не знает о том, что содержится во внутренних vector с.

Вам не нужно беспокоиться об этом.

0 голосов
/ 12 июля 2019

Каждый тип имеет размер, и все объекты этого типа имеют одинаковый размер.Размер объекта никогда не изменяется во всей программе.Поэтому описанный вами сценарий не существует.

Способ, которым вектор "изменяет размеры" без изменения размера векторного объекта, достигается путем косвенного обращения.Элементы не являются частью памяти объекта.Вместо этого вектор указывает на буфер в динамической памяти.Изменение размера выполняется путем создания большего динамического буфера и копирования элементов из старого перед уничтожением старого буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...