Как очистить вектор с
Для добавления элементов в вектор применяется функция push_back() , в которую передается добавляемый элемент:
Векторы являются динамическими структурами в отличие от массивов, где мы скованы его заданым размером. Поэтому мы можем динамически добавлять в вектор новые данные.
Функция emplace_back() выполняет аналогичную задачу — добавляет элемент в конец контейнера:
Добавление элементов на определенную позицию
Ряд функций позволяет добавлять элементы на определенную позицию.
emplace(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos
insert(pos, value) : вставляет элемент value на позицию, на которую указывает итератор pos, аналогично функции emplace
insert(pos, n, value) : вставляет n элементов value начиная с позиции, на которую указывает итератор pos
insert(pos, begin, end) : вставляет начиная с позиции, на которую указывает итератор pos, элементы из другого контейнера из диапазона между итераторами begin и end
insert(pos, values) : вставляет список значений начиная с позиции, на которую указывает итератор pos
Удаление элементов
Если необходимо удалить все элементы вектора, то можно использовать функцию clear :
Функция pop_back() удаляет последний элемент вектора:
Если нужно удалить элемент из середины или начала контейнера, применяется функция std::erase() , которая имеет следующие формы:
erase(p) : удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент
erase(begin, end) : удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент
Также начиная со стандарта С++20 в язык была добавлена функция std::erase() . Она не является частью типа vector. В качестве первого параметра она принимает вектор, а в качестве второго — элемент, который надо удалить:
В данном случае удаляем из вектора numbers3 все вхождения числа 1.
Размер вектора
С помощью функции size() можно узнать размер вектора, а с помощью функции empty() проверить, путой ли вектор:
С помощью функции resize() можно изменить размер вектора. Эта функция имеет две формы:
resize(n) : оставляет в векторе n первых элементов. Если вектор содержит больше элементов, то его размер усекается до n элементов. Если размер вектора меньше n, то добавляются недостающие элементы и инициализируются значением по умолчанию
resize(n, value) : также оставляет в векторе n первых элементов. Если размер вектора меньше n, то добавляются недостающие элементы со значением value
Важно учитывать, что применение функции resize может сделать некорректными все итераторы, указатели и ссылки на элементы.
Изменение элементов вектора
Функция assign() позволяет заменить все элементы вектора определенным набором:
В данном случае элементы вектора заменяются набором из четырех строк «C++».
Также можно передать непосредственно набор значений, который заменит значения вектора:
Еще одна функция — swap() обменивает значения двух контейнеров:
Сравнение векторов
Векторы можно сравнивать — они поддерживают все операции сравнения: <, >, <=, >=, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:
Как очистить вектор с
Prerequisite: Vector in C++
Vectors are the same as dynamic arrays with the ability to resize themselves automatically when an element is inserted or deleted, with their storage being handled automatically by the container.
vector::clear()
The clear() function is used to remove all the elements of the vector container, thus making it size 0.
Syntax:
Parameters: No parameters are passed.
Result: All the elements of the vector are removed (or destroyed).
Example:
Output:
Time Complexity: O(N)
Auxiliary Space: O(1)
All elements are destroyed one by one.
Errors and Exceptions
- It has a no exception throw guarantee.
- It shows an error when a parameter is passed.
vector::erase()
erase() function is used to remove elements from a container from the specified position or range.
Syntax:
Parameters:
- Position of the element to be removed in the form of an iterator.
- The range specified using start and end iterators.
Result: Elements are removed from the specified position of the container.
Example:
Removing an element from a particular position
Example:
Time Complexity: O(N)
Auxiliary Space: O(1)
Removing elements within a range
Example:
Time Complexity: O(N)
Auxiliary Space: O(1)
Removing vector pair elements
Example:
Time Complexity: O(N)
Auxiliary Space: O(1)
Errors and Exceptions
- It has no exception throw guarantee if the position is valid.
- Shows undefined behavior otherwise.
Application
Given a list of integers, remove all the even elements from the vector and print the vector.
Input:
Output:
Explanation: 2, 4, 6, and 8 which are even and erased from the vector
Algorithm
- Run a loop to the size of the vector.
- Check if the element at each position is divisible by 2, if yes, remove the element and decrement the iterator.
- Print the final vector.
The below program implements the above approach.
Time Complexity: O(N) in the worst case as an erase takes linear time.
clear() vs erase(), When to use what?
clear() removes all the elements from a vector container, thus making its size 0. All the elements of the vector are removed using the clear() function.
erase() function, on the other hand, is used to remove specific elements from the container or a range of elements from the container, thus reducing its size by the number of elements removed.
Delete all items from a c++ std::vector
Doesn’t clear destruct the elements held by the vector?
Yes it does. It calls the destructor of every element in the vector before returning the memory. That depends on what «elements» you are storing in the vector. In the following example, I am storing the objects them selves inside the vector:
If you want to share objects between different containers for example, you could store pointers to them. In this case, when clear is called, only pointers memory is released, the actual objects are not touched:
For the question in the comment, I think getVector() is defined like this:
Удалить векторное содержимое и освободить память в C++
В этом посте мы обсудим, как удалить содержимое вектора и освободить память, выделенную вектором, для хранения объектов в C++.
1. Использование vector::clear функция
Мы можем использовать vector::clear функция для удаления всех элементов из вектора. Он работает, вызывая деструктор для каждого векторного объекта, но основное хранилище не освобождается. Итак, у нас остался vector нулевого размера, но с некоторой конечной емкостью.
результат:
The vector size is 0, and its capacity is 5
Начиная с C++11, мы можем вызывать vector::shrink_to_fit функционировать после clear() , что уменьшает способность вектора увеличивать размер. Он работает, “запрашивая” перераспределение вектора.
результат:
The vector size is 0, and its capacity is 0
2. Использование vector::erase функция
Другим решением является вызов vector::erase функцию на векторе, как показано ниже. Это также страдает от той же проблемы, что и clear() функция, т. е. не гарантируется перераспределение памяти в векторе.
результат:
The vector size is 0, and its capacity is 0
3. Использование vector::resize функция
Мы также можем использовать vector::resize функция изменения размера вектора. Обратите внимание, что эта функция не уничтожает векторные объекты, и все ссылки на объекты остаются действительными.
результат:
The vector size is 0, and its capacity is 0
4. Использование vector::swap функция
Все вышеперечисленные решения не могут освободить память, выделенную для векторного объекта, без вызова метода vector::shrink_to_fit функция. shrink_to_fit() уменьшает емкость, чтобы соответствовать размеру, но мы не можем полностью полагаться на это. Это связано с тем, что он делает необязательный запрос, и реализация вектора может полностью его игнорировать.
Существует еще один обходной путь для освобождения памяти, занятой векторным объектом. Идея состоит в том, чтобы заменить vector пустым вектором (без выделенной памяти). Это освободит память, занимаемую вектором, и всегда гарантированно будет работать.