Пишу для себя реализацию контейнера vector. И не могу понять принцип работы и что вообще делают методи vector::capacity() и vector::reserve(). Читал документацию, но ничего не понимаю.
Дело в том, что внутри вектора используется простой динамический массив (это должно быть очевидно, но я уточню все же), на который можно даже получить указатель через 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().
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости