С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
#1

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

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

Всем доброе утро!
Следующий вопрос не дает мне спать по ночам - в чём таки разница между resize и reserve класса vector?..
Думала, что понимала, оказалось нет.
Кому не сложно и кто точно знает - объясните, пожалуйста.
Заранее спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2014, 12:39
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разница между resize и reserve (C++):

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

Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()? - C++
Есть такая функция: void Array::SetStartIndexes(sz3_Arr_t *array) { start_index.reserve(array->size()); ...

Разница между if else и else if - C++
Привет, у меня возник "нубский" вопрос. Этот код, это же соркащенная версия нижнего? int i = 3; if (i == 1) ...

Разница между С и С++ - C++
Если не брать во внимание объекты и классы, то разница состоит только лишь в cin, cout и директивах?

Разница между 0 и 00 ? - C++
Как заставить программу различать 0 и 00 (ноль и два ноля, как в рулетке)? Вариант с заменой 00 на какое-то число не подходит, так как...

Разница между != и <= - C++
Здравствуйте! Писал программу с использованием QuickSort и заинтересовала такая вещь: void quickSort(int arr, int left, int right) { ...

6
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.02.2014, 12:40 #2
У вектора есть ёмкость (кол-во выделенной памяти), а есть размер (кол-во актуальных элементов).
Так вот, reserve изменяет ёмкость, а resize - размер.
1
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
21.02.2014, 12:42  [ТС] #3
Не понятен особенно такой момент: если мы заресайзим вектор, и сайз больше, то, получается, копируется вектор и что с остальными? Капасити оставляет запас? И чем он заполняется?
Резерв же сайз не трогает, вроде. Только капасити. Но чем там заполняются выделенные части?
Запуталась.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
21.02.2014, 12:50 #4
Цитата Сообщение от Тамика Посмотреть сообщение
что с остальными? Капасити оставляет запас? И чем он заполняется?
как правило, сырой памятью
1
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.02.2014, 12:53 #5
Если resize() вызывается со значением > чем текущий размер (size), то создаются дополнительные элементы конструктором по умолчанию. Если < чем текущий размер, то лишние элементы удаляются из вектора.
reserve() может только увеличить ёмкость до заданного числа элементов (выделит память, но никаких элементов создано не будет). Т.е. вызов reserve() не влияет на size. Если нужно уменьшить емкость, то надо либо использовать подход со swap, либо (C++11) вызов shrink_to_fit().
1
Тамика
Котовчанин
917 / 461 / 145
Регистрация: 16.02.2010
Сообщений: 3,229
Записей в блоге: 27
21.02.2014, 12:55  [ТС] #6
А если сайз = 1, но мы пушбекаем два элемента, например.
Капасити увеличится и будет три или он с запасом выделит память?
Я читала, что капасити всегда выделяет при ресайзе больше, чем сайз.
Но вот написала тестовый код - и капасити с ресайзом идут в ногу.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
21.02.2014, 13:15 #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
Ну разных компиляторах, скорее всего будут разные значения.
1
21.02.2014, 13:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2014, 13:15
Привет! Вот еще темы с ответами:

В чем разница между [] и * ? - C++
Думал, что ни в чем, но когда попытался сделать так: (в файле 1) char lc; в файле 2: extern char* lc; Компилятор ругаться не стал,...

Разница между DEV и VS - C++
Подскажите пожалуйста в чем проблема, писал задания на DEV C++, теперь начал работать на VS, но они не работают там.

Разница между T **a и T *a[const_size] - C++
T c_a; // Здесь тип c_a это T(*) T **d_a = (T**) malloc(sizeof(T) * size); for (i = 0; i &lt; size; ++i) { d_a = (T*)...

В чем разница между С и С++ - C++
Возник вопрос в чем жи разница между С и С++ кроме того, что в С++ есть классы а в С их нету ?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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