Отличия, принцип работы vector::reserve() и vector::capacity()

254
09 апреля 2017, 03:43

Пишу для себя реализацию контейнера vector. И не могу понять принцип работы и что вообще делают методи vector::capacity() и vector::reserve(). Читал документацию, но ничего не понимаю.

Answer 1

Дело в том, что внутри вектора используется простой динамический массив (это должно быть очевидно, но я уточню все же), на который можно даже получить указатель через vector:data(). При этом вектор позволяет почти неограниченно добавлять данные в него (пока память не кончится). Как же он это делает? Также как и вы бы делали с динамическим массивом: запрашивает у ОС блок памяти большего размера, копирует туда все текущие данные, добавляет туда новые данные и освобождает старый блок памяти.

Но есть одна особенность: если память в текущем блоке закончилась и вы хотите еще добавить данные, он запрашивает новый блок памяти куда большего размера, чем необходимо (например в два раза больше, чем есть сейчас, а не N+1, где N это текущее количество элементов в векторе). Зачем? Представьте что вам надо добавлять в конец вектора много-много элементов в цикле. Представьте как медленно оно будет работать, если на каждой итерации придется заново перевыделять память на N+1 элементов, потом это все копировать еще, короче ужас. А если запросить сразу много памяти, то перевыделять память придется куда реже.

Тут конечно важно соблюсти меру, чтобы не было много неиспользуемой памяти. Я не знаю честно, по какой стратегии различные реализации вектора вычисляют размер памяти, который надо выделить, но мне видится так, что выделять каждый раз в 2 раза больше памяти, чем есть, это достаточно оптимально. GCC вроде так и делает.

Теперь непосредственно перейду к вопросу. vector::capacity() показывает, сколько элементов вектор может вместить без перевыделения памяти, тогда как vector::size() показывает, сколько элементов хранится в векторе в текущий момент. Понятно, что vector::size() будет меньше или равен vector::capacity(). vector::reserve(size_type N) же говорит вектору выделить достаточно памяти для хранения минимум N элементов, то есть эта функция изменяет vector::capacity().

READ ALSO
Как подключить audio visualizer?

Как подключить audio visualizer?

Не понимаю, просто на html странице(ссылка на страницу) всё работает, к сайту же не получается подключить, делаю всё тоже самоеПочему не хочет...

297
Проблема с slick slider и owl carousel

Проблема с slick slider и owl carousel

Проблема заключается в одновременном использовании variableWidth(autoWidth) и centerMode(center)Когда в слайдере мало картинок, ни одна библиотека не справляется...

342
Как сделать ajax запрос в reactjs?

Как сделать ajax запрос в reactjs?

просмотрел кучу статей, как то все очень усложнено

389
Пустой запрос laravel + backbone + json

Пустой запрос laravel + backbone + json

Пишу API к серверуОбращаюсь к этому API с backbone

277