Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.58/40: Рейтинг темы: голосов - 40, средняя оценка - 4.58
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793

Зачем нужен reserve() в <vector>?

27.07.2021, 19:07. Показов 8215. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Представим, что создаю вектор v, который с помощью цикла for и push_back заполняю числами от 0 до 9. Размер массива v.size() будет 10. Но вот для чего нужен reserve(), если все работает и без него. Вот напишу v.reserve(10) и что это даст? Кроме того, заметил, что не дай бог цикл выйдет за значение резерва на один элемент, то capacity() будет равно не 11, а ближайшему значению, которое больше количество элементов и которое может быть представлено с помощью 2^n, т.е. 2^4 = 16. Если резерв был 512 и вышел на один элемент, то capacity() станет аж 1024 (2^10), а не 513. Причем reserve() только увеличивает capacity(), но не уменьшает. Приходится использовать shrink_to_fit().
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.07.2021, 19:07
Ответы с готовыми решениями:

QVector::reserve() + std::vector::reserve() и добавление в начало
Если зарезервировать в новосозданном векторе место, а затем добавлять объекты классов в начало - будет ли эффективнее вставка? Или...

Vector reserve
Если использовать reserve с push_back это будет экономия ресурсов и производительности? vector&lt;int&gt;arr; arr.reserve(10); ...

Зачем нужна конвертация чисел в текст (TO_CHAR) и текст в число (TO_NUMBER). Так же зачем нужен оператор NULLIF?
Описывают как очень удобные функции, только я как видел то что было число 193, так оно и осталось 193, только СУБД эти числа видит как...

10
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,227
27.07.2021, 19:09
Лучший ответ Сообщение было отмечено Royal_X как решение

Решение

Цитата Сообщение от Royal_X Посмотреть сообщение
Представим, что создаю вектор v, который с помощью цикла for и push_back заполняю числами от 0 до 9. Размер массива v.size() будет 10.
... но для того, чтобы вектор достиг размера 10 (или 100, или 1000), ему придется по пути несколько раз выполнить перевыделение памяти. На что тратится время.

Цитата Сообщение от Royal_X Посмотреть сообщение
Но вот для чего нужен reserve(), если все работает и без него.
Если бы вы заранее зарезервировали целевую емкость при помощи reserve(), то вашему вектору не пришлось бы тратить время на перевыделения памяти по мере заполнения.
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
27.07.2021, 19:18  [ТС]
TheCalligrapher, т.е. получается в языке С++ единственный способ инициализировать массив не зная его размера это через vector, причем даже для него рекомендовано указать заранее reserve()?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.07.2021, 19:21
Цитата Сообщение от Royal_X Посмотреть сообщение
Зачем нужен reserve в <vector>?
reserve(10) гарантирует что ты следующие 10 раз вызовешь push_back за константное время.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2021, 19:24
Цитата Сообщение от Royal_X Посмотреть сообщение
Но вот для чего нужен reserve(), если все работает и без него.
это такой хинт: ты можешь заранее указать сколько ожидается элементов.
вектор сразу же застолбит необходимый объём памяти.
что позволяет избежать реалоков.

без него, конечно, тоже будет работать.
но в общем случае не так эффективно.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
27.07.2021, 19:26  [ТС]
hoggy, знал бы количество элементов, то использовал бы обычный массив: int numbers [10];
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2021, 19:32
Цитата Сообщение от Royal_X Посмотреть сообщение
знал бы количество элементов, то использовал бы обычный массив: int numbers [10];
существует множество ситуаций,
когда нужна возможность динамически изменять кол-во элементов.
но при этом либо заранее известно стартовое значение.
либо заранее известно среднестатистическое ожидаемое.

например: класс "конфигурации".
позволяет на лету добавлять новые записи, и удалять старые..
поэтому, требуется поддержка динамики.

однако, при создании объекта,
точно известно стартовое кол-во записей.
поэтому, можно (и нужно) использовать резерв.
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6221 / 2917 / 1046
Регистрация: 01.06.2021
Сообщений: 10,793
27.07.2021, 19:33  [ТС]
я как понял, в C++ (в отличие от, скажем, Java) нельзя создать функцию, которая возвращает обычный массив, поэтому порой приходится использовать вектор или указатели.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.07.2021, 19:43
Цитата Сообщение от Royal_X Посмотреть сообщение
нельзя создать функцию, которая возвращает обычный массив
если очень хочется вернуть массив,
то можно можно вернуть его как член стукруты:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
struct example
{
    example()
        : buf {"hi"}
    {}
    
    char buf[3];
};
 
example foo()
{
    example ex;
    std::cout << "foo: " << ex.buf << '\n';
    return ex;
}
 
int main()
{
    example ex = foo();
    std::cout << "main: " << ex.buf << '\n';
}

ну или использовать std::array


Цитата Сообщение от Royal_X Посмотреть сообщение
поэтому порой приходится использовать вектор или указатели.
нет никаких "поэтому".

вектор (ну или велосипед на указателях) используют когда нужна динамика.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
27.07.2021, 19:45
Royal_X,
Цитата Сообщение от hoggy Посмотреть сообщение
вектор (ну или велосипед на указателях) используют когда нужна динамика.
это он наверное хочет сказать что в C++ контроля над памятью больше чем в других языках.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
27.07.2021, 20:15
Цитата Сообщение от Royal_X Посмотреть сообщение
знал бы количество элементов, то использовал бы обычный массив: int numbers [10];
Попробуйте:

C++
1
2
3
4
type generateRandomNumbers(unsigned count)
{
   //генерирование count-чисел и возврат массива
}
ждем решение с массивом.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.07.2021, 20:15
Помогаю со студенческими работами здесь

Зачем нужен using?
Пожалуйста подскажите зачем использовать слово using?например пот здесь: using (var reader = new StreamReader(filename))

Зачем он нужен?
Зачем нужен git bush если есть Github Desktop? Т.е. в декстопе можно делать все тоже самое только интерактивно

Зачем нужен Qt
Привет всем. Такой собственно вопрос. Зачем нужен Qt и есть ли смысл его изучать? C++ знаю на более менее среднем уровне, WinAPI тоже...

Зачем нужен F#?
Вы не подумайте, что я злодей. Просто зачем нужен F#, если есть C# или хотя-бы VB.NET, в которых возможностей больше?

Зачем нужен указатель this
Я начал изучать ООП и не могу понять, а зачем таки нужен указатель this-&gt;? Объясните, пожалуйста


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru