C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
работа с контейнером vector из STL
** kea
Отправлено: 03.10.2005, 10:32


Не зарегистрирован







Здравствуйте! Привожу код:
vector bv;
int s0 = bv.size();
int c0 = bv.capacity();
bv.resize(500);
int s100 = bv.size();
int c100 = bv.capacity();
bv.resize(38);
bv.reserve(38);
int s38 = bv.size();
int c38 = bv.capacity();
Здесь
s0 = 0, c0 = 0
s500 = 500, c0 = 512
s38 = 38, c38 = 512
т.е. при уменьшении размера вектора не происходит высвобождение лишней памяти?
Когда происходит высвобождение памяти у контейнера vector?
Использовался STL и Builder 6.


Asher
Отправлено: 03.10.2005, 10:58


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
QUOTE
при уменьшении размера вектора не происходит высвобождение лишней памяти?

.capacity() показывает сколько ЕЩЁ элементов можно разместить без расширения контейнера. Если size и capacity возвращают одинаковое значение, значит свободного места не осталось и следующая вставка приведет к выделению памяти.
Если размер устанавливаемый через reserve меньше текущего vector вообще ничего не делает.
Для усечения размера vectora обычно применяют трюк с перестановкой.
Например:
CODE
vector<int> vct_;
vector<int>(vct_).swap(vct_);

Но, в общем случае, значения допустимых размеров могут быть кратны каким либо значениям, например степеням двойки, и capacity покажет ближайший больший размер.
** kea
Отправлено: 03.10.2005, 16:07


Не зарегистрирован







Здравствуйте!
Если не применять трюк с перестановкой, который вы привели, то все же происходит потеря памяти?
Asher
Отправлено: 03.10.2005, 16:36


Мастер участка

Группа: Модератор
Сообщений: 550



Смотря что считать потерей.
Утечки нет, но зарезервированная память операционной системе при resize не возвращается.

P.S. прелесть stl в том, что она идет в исходниках. Смотрите и вникайте. biggrin.gif

Отредактировано Asher — 03/10/2005, 17:38
** kea
Отправлено: 04.10.2005, 15:30


Не зарегистрирован







Здравствуйте!
vector(vct_).swap(vct_); — сколько это будет стоить по времени?
Gedeon
Отправлено: 04.10.2005, 15:45


Ветеран

Группа: Модератор
Сообщений: 1742



Зависит от кол-ва элементов в контейнере и типа самих элементов.
Gedeon
Отправлено: 04.10.2005, 15:59


Ветеран

Группа: Модератор
Сообщений: 1742



Вот тут заглянул в Джосьютиса, так там написано что
эта ф-ция переставляет внутренние указатели со ссылками на данные, так что если контейнеры одного типа, то от типа самих элементов похоже время не зависит.
Asher
Отправлено: 04.10.2005, 16:22


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Тут все не так просто. wink.gif
Выражение vector(vct_).swap(vct_); создает временный вектор, содержащий копию vct_, а затем содержимое вектора vct_ меняется с временным вектором функцией swap. После этого старый "раздутый" вектор, который теперь временный, уничтожается.
Основная работа выполняется копирующим конструктором.
Соотвественно все временные затраты — там.

При этом он выделяет ровно столько памяти, сколько необходимо для хранения vct_ (ну с учетом размера блока памяти используемого в данной версии stl по умолчанию и Вы не применяли собственный аллокатор)

Отредактировано Asher — 04/10/2005, 17:22
** kea
Отправлено: 07.10.2005, 13:33


Не зарегистрирован







Здравствуйте!
А оператор .clear() приводит к освобождению памяти, например, в деструкторе объекта использующего контейнер vector?
Asher
Отправлено: 07.10.2005, 15:24


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Если я правильно понял вопрос, то...
clear() приводит к осовбождению памяти занятой контейнером, но если контейнер содержит не объекты а указатели на них, то сами объекты не удаляются.

P.S. может быть купите или скачаете себе "Стандартная библиотека С++" Джосьютиса ?
Сразу отпадет множество вопросов.
** kea
Отправлено: 12.10.2005, 17:37


Не зарегистрирован







Здравствуйте!
Если выложите ссылочку на такую книгу "Стандартная библиотека С++", то с удовольствием скачаю.
К тому же рад общению со знающими людьми.
Asher
Отправлено: 13.10.2005, 07:52


Мастер участка

Группа: Модератор
Сообщений: 550



Привет.
Здесь лежит электронная версия книги Джосьютиса

Вернуться в Вопросы программирования в C++Builder