Как очистить память вектора с

стереть вектор () и очистить () в C ++

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

вектор :: ясно ()

Функция clear () используется для удаления всех элементов векторного контейнера, что делает его размером 0.
Синтаксис:

Ошибки и исключения

1. Не имеет исключительной гарантии.
2. Показывает ошибку при передаче параметра.

// Программа CPP для иллюстрации
// Реализация функции clear ()
#include
#include

using namespace std;

vector int > myvector;

// Вектор становится 1, 2, 3, 4, 5

// вектор становится пустым

Сложность времени: O (N)
Все элементы уничтожены один за другим.

вектор :: Стирание ()

Функция erase () используется для удаления элементов из контейнера из указанной позиции или диапазона.

Синтаксис:

Ошибки и исключения

1. У него нет гарантии броска без исключения, если позиция действительна.
2. Показывает неопределенное поведение в противном случае.

Извлечение элемента из определенной позиции

// Программа CPP для иллюстрации
// работа функции erase ()
#include
#include

using namespace std;

vector int > myvector< 1, 2, 3, 4, 5 >;

vector int >::iterator it;

Удаление элементов в пределах диапазона

// Программа CPP для иллюстрации
// Реализация функции erase ()
#include
#include

using namespace std;

vector int > myvector< 1, 2, 3, 4, 5 >;

vector int >::iterator it1, it2;

заявка
Получив список целых чисел, удалите все четные элементы из вектора и напечатайте вектор.

Алгоритм
1. Запустите цикл до размера вектора.
2. Проверьте, делится ли элемент в каждой позиции на 2, если да, удалите элемент и уменьшите итератор.
3. Напечатайте окончательный вектор.

// Программа CPP для иллюстрации
// Применение функции erase ()
#include
#include

using namespace std;

Сложность времени: O (N) в худшем случае, когда 1-й элемент удаляется, а O (1) в лучшем случае, когда последний элемент удаляется.

clear () против erase (), когда использовать что?

clear () удаляет все элементы из векторного контейнера, таким образом, его размер равен 0. Все элементы вектора удаляются с помощью функции clear ().
Функция erase (), с другой стороны, используется для удаления определенных элементов из контейнера или ряда элементов из контейнера, тем самым уменьшая его размер на количество удаленных элементов.

Источник

Алёна C++

программирование для прагматиков

среда, ноября 23, 2005

Освобождение памяти, выделенной под vector

Некоторое время назад я писала про выделение памяти под vector и в конце немного затронула тему высвобождения памяти. В большинстве реализаций освободить память, выделенную под vector, можно только с помощью трюка, известного как swap trick. Недавно я вычитала, что в реализации STL из Visual C++ 7.1 память, выделенная под вектор, высвобождается при вызове метода clear(). 7.1 у меня нет, зато у меня есть Microsoft Visual C++ Toolkit 2003. Действительно, освобождается. Для такого кода:

vector v;
v.reserve(17);
cout
Вывод получается такой:

Microsoft Visual C++ Toolkit 2003:
17
0 //действительно, освободилась
MSVC++6.0:
17
17
MinGW gcc 3.4.4:
17
17

Я решила копать дальше. Я всегда считала, что метод clear для последовательных контейнеров эквивалентен erase всего контейнера. Нашла упоминание об этом в документации STL на sgi.com. Вот оттуда выдержка:
a.clear() Equivalent to a.erase(a.begin(), a.end())
Запускаю код:
vector v;
v.reserve(17);
cout
Получаю:
Microsoft Visual C++ Toolkit 2003:
17
17 //не освободилась
MSVC++6.0:
17
17
MinGW gcc 3.4.4:
17
17

Получается, что в случае вышеупомянутого тулкита нет обещанной эквивалентности. Так, а что говорит об этом Стандарт? Вот тут интересный момент. Там нет слова «эквивалентно». Там erase(begin(), end()) приписано к clear() в качестве assertion/note для последовательных контейнеров. А вот требование там одно, что post condition: size()==0. Оно тут выполняется.
Так что MSVC++2003 тут прав.
Я пробовала также v.resize(0). Пробовала удалить все элементы вектора с помощью pop_back’ов. Память не освобождается. Это происходит только при вызове clear.

7 коммент.:

For doing this portably, you need to write your own allocator. 🙁

Я бы использовал тут слово «стандартно» вместо «правильно», потому как правильно было б не освобождать память. Освобождение исключает возможность повторного использования уже выделенной памяти

1) аллокацию нового пула (скорее всего, вдвое большего, чем раньше)

Вдвое больший пул использовался в старых компиляторах, в VC++6.0, например. Он ведет к довольно неэффективному использованию памяти. В VC++7 уже используется константа 1.5.

Если Вам не нравится такое поведение

Речь идет об освобождении памяти, выделенной под вектор, а не о выборе контейнеров.

Уменьшение размеров вектора не уменьшает его его емкости. Чтобы вернуть память системе, нужно сделать следующий трюк:

vector tmp = v;
v.swap(tmp);

Просит удаления неиспользуемых мощностей.
Это необязательный просьбой сократить capacity в size. Это зависит от реализации, если запрос выполняется.
void shrink_to_fit(); // (начиная с C++11)

Источник

Как очистить вектор из C++ из памяти

Я новичок в C++, поэтому это может быть вопрос новичков, но я не совсем понимаю, как очистить его от памяти. Я искал в Интернете и смотрел несколько ответов, но не понял, как правильно выполнить то, что я пытаюсь сделать.

Как я могу правильно очистить свой вектор от памяти в C++? Спасибо, и я извиняюсь, если это дублированный пост.

Как уже упоминалось в комментарии ниже, я хотел бы вернуть использованную память.

за исключением того, что он не возвращает никакой памяти в систему, так как емкость остается неизменной.

Если вы хотите сбросить вы вектор обратно в порожнем состоянии, то мы можем использовать swap трюк, чтобы поменять местами содержимое вектора в временный, который будет разрушаться и освободить память

Это создаст временный пустой вектор, замените его тем, который у вас есть, теперь он пуст, а затем уничтожьте все во временном векторе.

Вы можете видеть, как он работает в этом маленьком примере

Когда ваша программа закончится, vector dtor будет вызван и удалит ваш вектор для вас, поскольку вы выделили его в стеке. Кроме того, dtor для ElementData будет вызываться для каждого в векторе.

std :: векторные переменные обычно удаляются автоматически, когда вы выходите из области видимости, или когда объект класса, из которого они являются членами, уничтожается. Деструктор std :: vector также уничтожает все элементы вектора.

Чтобы полностью очистить вектор в явном виде, сначала очистите вектор (уничтожьте элементы)

затем вернуть память, ранее зарезервированную для векторных элементов

Только вызывайте shrink_to_fit если это вероятно, что вектор ранее содержал гораздо больше элементов, чем вы собираетесь его заполнить.

В большинстве случаев лучший способ – ограничить область действия вектора тем, где он действительно необходим. Итак, вместо чего-то вроде:

Другое преимущество этого заключается в том, что после того, как Elements выйдет из сферы действия, вы не можете его повторно использовать повторно. Если функция мала, вам, вероятно, не нужно создавать новую явную область. Возврат из функции будет иметь тот же эффект.

Elements.clear() будут делать то, что вы хотите.

Вот остальные функции, доступные для векторов.

Источник

Как правильно освободить память занятую элементами vector

Не могли бы пожалуйста подсказать, при добавление элемента в вектор я создаю его с помощью команды new

И в конце программы я хочу чтобы деструктор класса, который хранит в себе vector удалил все его элементы, и если честно не получается, может кто подскажет?

4 ответа 4

Вот демонстрационная программа.

Ее вывод на консоль

Если хотите использовать цикл вместо алгоритма, то достаточно написать

Результат будет такой же, что и для программы, показанной выше.

Что касается вашего собственного цикла, то правильно его будет записать следующим образом:

Обратите внимание, что вместо данного объявления конструктора

будет лучше записать

Также в виду того, что вы используете вектор указателей, вам следует либо запретить копирование объектов класса, как, например, в определении класса записать

Либо определить их явно.

Company()’: Company.h:26:13: error: ‘default_delete’ is not a member of ‘std’ std::default_delete (); ^ Company.h:26:38: error: expected primary-expression before ‘>’ token std::default_delete (); ^ Company.h:26:40: error: expected primary-expression before ‘)’ token std::default_delete ();

Если вы хотите чтобы при удалении элементов автоматически выполнялся их деструктор, то вам нужно либо завернуть указатели в «умные указатели», либо хранить в векторе не указатели, а сами объекты.

Второй вариант, деструктор вектора автоматически вызовет деструкторы для каждого элемента:

Как очистить память вектора с

Вам нужно просто в цикле сделать

Однако имейте в виду, что если с вектором такой номер еще пройдет, то вот с другим типом контейнера запросто могут возникнуть проблемы.

В том числе именно по этой причине имеет смысл использовать «умные указатели» для хранения указателей в контейнерах.

Источник

Выделение / удаление векторной динамической памяти в C ++

Когда я пытаюсь удалить элементы динамической памяти динамического вектора объектов, мне приходится повторять итерацию по всему размеру вектора более одного раза, чтобы обеспечить полное освобождение.

Кажется, что вектор перебирает каждый второй элемент, когда я пытаюсь удалить, так как мне требуется дополнительный цикл while для обеспечения полного освобождения.

Мне кажется, что-то не хватает во внутренней работе вектора, я попытался прочитать ссылку на вектор c ++, и я понимаю, что векторы хранят элементы в смежном месте и что они выделяют дополнительную память для возможного роста, но я не понимаю поведения этого кода.

Решение

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

Другие решения

Когда вы удаляете элемент из вектора, элементы после этого перемещаются на одно место. При удалении элемента в индексе 0 элемент в индексе 1 будет перемещен в индекс 0 и не будет удален в следующей итерации.

Возьмите стирание из петли. В любом случае элементы будут уничтожены в деструкторе векторов.

Я думаю, что реальная проблема здесь в том, что вы пропускаете проверку состояния цикла.
Я делаю небольшое изменение в вашем коде:

У меня есть два предложения, которые также являются моими вопросами:

Используйте умный указатель, чтобы управлять ресурсом.

лучше использовать векторный объект в стеке.

Причина, по которой это происходит, очень проста: вы вытаскиваете коврик из-под собственных ног, стирая элемент i, а затем увеличивая i …

я = 0: автомобили = <1>[2] [3]

я = 1: автомобили = [1] <2>[3]

я = 1: автомобили = [1]

Использование стирания, как это неэффективно. Вы можете рассмотреть следующие два подхода:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *