Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Тамика
Котовчанин
869 / 449 / 142
Регистрация: 16.02.2010
Сообщений: 2,889
Записей в блоге: 27
#1

Разница между resize и reserve - C++

21.02.2014, 12:39. Просмотров 1820. Ответов 6
Метки нет (Все метки)

Всем доброе утро!
Следующий вопрос не дает мне спать по ночам - в чём таки разница между resize и reserve класса vector?..
Думала, что понимала, оказалось нет.
Кому не сложно и кто точно знает - объясните, пожалуйста.
Заранее спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.02.2014, 12:40     Разница между resize и reserve #2
У вектора есть ёмкость (кол-во выделенной памяти), а есть размер (кол-во актуальных элементов).
Так вот, reserve изменяет ёмкость, а resize - размер.
Тамика
Котовчанин
869 / 449 / 142
Регистрация: 16.02.2010
Сообщений: 2,889
Записей в блоге: 27
21.02.2014, 12:42  [ТС]     Разница между resize и reserve #3
Не понятен особенно такой момент: если мы заресайзим вектор, и сайз больше, то, получается, копируется вектор и что с остальными? Капасити оставляет запас? И чем он заполняется?
Резерв же сайз не трогает, вроде. Только капасити. Но чем там заполняются выделенные части?
Запуталась.
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
21.02.2014, 12:50     Разница между resize и reserve #4
Цитата Сообщение от Тамика Посмотреть сообщение
что с остальными? Капасити оставляет запас? И чем он заполняется?
как правило, сырой памятью
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.02.2014, 12:53     Разница между resize и reserve #5
Если resize() вызывается со значением > чем текущий размер (size), то создаются дополнительные элементы конструктором по умолчанию. Если < чем текущий размер, то лишние элементы удаляются из вектора.
reserve() может только увеличить ёмкость до заданного числа элементов (выделит память, но никаких элементов создано не будет). Т.е. вызов reserve() не влияет на size. Если нужно уменьшить емкость, то надо либо использовать подход со swap, либо (C++11) вызов shrink_to_fit().
Тамика
Котовчанин
869 / 449 / 142
Регистрация: 16.02.2010
Сообщений: 2,889
Записей в блоге: 27
21.02.2014, 12:55  [ТС]     Разница между resize и reserve #6
А если сайз = 1, но мы пушбекаем два элемента, например.
Капасити увеличится и будет три или он с запасом выделит память?
Я читала, что капасити всегда выделяет при ресайзе больше, чем сайз.
Но вот написала тестовый код - и капасити с ресайзом идут в ногу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 13:15     Разница между resize и reserve
Еще ссылки по теме:
C++ В чем разница между [] и * ?
C++ Разница между T **a и T *a[const_size]
вчем разница между с++ и ++с C++
Разница между программами C++
C++ В чем разница между X x; и X x()?

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4392 / 3235 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.02.2014, 13:15     Разница между resize и reserve #7
Цитата Сообщение от Тамика Посмотреть сообщение
Капасити увеличится и будет три или он с запасом выделит память?
Зависит от реализации. Обычно делают с запасом.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
 
int main() {
    
    std::vector<int> v;
    auto cap = v.capacity();
    int capChanged = 20;
    
    while(capChanged)
    {
        std::cout << "size=" << v.size() << " capacity=" << v.capacity() << std::endl;
        if( cap == v.capacity() )
        {
            v.resize(cap+1);
            cap = v.capacity();
            capChanged--;
        }
    }
    
    return 0;
}
http://ideone.com/sdw4Ad
Ну разных компиляторах, скорее всего будут разные значения.
Yandex
Объявления
21.02.2014, 13:15     Разница между resize и reserve
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru