Каков наилучший способ изменить его размер на 0 и емкость на N (заданное число)? Моя прямая идея: ...
Ваша прямая идея верна, и самый простой вариант. Хотя, чтобы быть педантичным, reserve
меняет емкость на больше или , равную данному числу; не гарантированно будет равным (но все протестированные мной реализации действительно выделяют именно ту сумму, если предыдущая емкость была меньше).
Так что мне интересно, как избежать перераспределения, когда емкость источника больше, чем заданное N?
Используя стандартную реализацию библиотеки, которая решила не освобождать память при вызове clear
(т. Е. Любая стандартная соответствующая реализация, как указано ответом здесь ).
Другой подход к гарантии (хотя, как представляется, это не является необходимым, поскольку вышеприведенное должно быть гарантировано, несмотря на слабую формулировку на cplusplus.com) отсутствие перераспределения (в случае N > t.capacity()
): поскольку вектор содержит простые целые числа и вы, кажется, знаете, сколько будет элементов (как вы знаете, чтобы зарезервировать), вы можете просто позвонить t.resize(N)
(чтобы удалить дополнительные элементы в случае, если размер был больше), не очищая вектор, а затем перейти к перезаписи существующих элементы, а не выдвигать новые.
Конечно, это означает, что вы не сможете наблюдать за количеством элементов, которые были перезаписаны, поэтому этот подход не применим для всех случаев использования. Хорошо, если вы просто хотите заполнить вектор простым циклом.
Возможно, вы захотите зарезервировать перед изменением размера, если новый размер может быть больше, чем старый, и вы хотите не перераспределять. Это связано с тем, что большинство реализаций распределяют точную сумму резерва (как я уже говорил), но используют стратегию умножения при изменении размера (насколько мне известно, ни одно из этих поведений не гарантировано, но используемые мной реализации соответствовали этому поведению).