Pop back c что делает

от admin

Pop back c что делает

Для добавления элементов в вектор применяется функция 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() обменивает значения двух контейнеров:

Сравнение векторов

Векторы можно сравнивать — они поддерживают все операции сравнения: <, >, <=, >=, ==, !=. Сравнение контейнеров осуществляется на основании сравнения пар элементов на тех же позициях. Векторы равны, если они содержат одинаковые элементы на тех же позициях. Иначе они не равны:

Использование функции Vector Pop_Back () в C++

Использование функции Vector Pop_Back () в C++

Программирование и разработка

Размер вектора можно уменьшить, используя различные встроенные функции C ++. Функция pop_back () — одна из них. Он используется для удаления последнего элемента вектора сзади и уменьшения размера вектора на 1. Но последний элемент вектора не удаляется навсегда, как функция erase (). В этом руководстве были объяснены различные варианты использования этой функции.

Синтаксис:

Эта функция не имеет аргументов и ничего не возвращает.

Предварительные условия:

Прежде чем проверять примеры этого руководства, вы должны проверить, установлен ли компилятор g ++ в системе. Если вы используете Visual Studio Code, установите необходимые расширения для компиляции исходного кода C ++ и создания исполняемого кода. Здесь приложение Visual Studio Code было использовано для компиляции и выполнения кода C ++. Способы уменьшения размера вектора с помощью функции pop_back () показаны в следующей части этого руководства.

Пример 1: удалить несколько элементов из вектора

Создайте файл C ++ со следующим кодом, чтобы удалить два элемента из контейнера вектора путем уменьшения размера вектора с помощью функции pop_back (). В коде объявлен вектор из 5 строковых значений. Функция pop_back () вызывалась здесь два раза, чтобы временно удалить два последних элемента из вектора и уменьшить размер вектора на 2. Содержимое вектора было напечатано два раза до и после использования функции pop_back ().

//Include necessary libraries

#include <iostream>

#include <vector>

using namespace std ;

int main ( ) <

//Declare a vector of string values

vector < string > flowers = < «Rose» , «Lity» , «Marigold» , «Tulip» , «Water Liiy» >;

cout << «The values of the vector : \n « ;

//Iterate the vector using loop to print the values

for ( int i = 0 ; i < flowers. size ( ) ; ++ i )

cout << flowers [ i ] << » « ;

cout << « \n « ;

//Remove the last two values from the vector

flowers. pop_back ( ) ;

flowers. pop_back ( ) ;

cout << « \n The values of the vector after remove : \n « ;

//Iterate the vector using loop to print the values

for ( int i = 0 ; i < flowers. size ( ) ; ++ i )

cout << flowers [ i ] << » « ;

cout << « \n « ;

return 0 ;

>

Следующий вывод появится после выполнения вышеуказанного кода.

Следующий вывод появится после

Пример 2: Создать новый вектор из другого вектора

Создайте файл C ++ со следующим кодом для вставки определенных значений в пустой вектор из другого вектора путем удаления элементов с помощью функции pop_back (). В коде объявлены вектор из 8 целых чисел и пустой вектор целочисленного типа. Цикл while использовался для перебора каждого элемента первого вектора и вставки элемента в новый вектор, если число делится на 2. Здесь также была вычислена сумма всех четных чисел. Каждый элемент первого вектора будет удален функцией pop_back () на каждой итерации цикла, чтобы достичь условия завершения цикла.

//Include necessary libraries

#include <iostream>

#include <vector>

using namespace std ;

int main ( )

<

//Declare a vector of integer data

vector < int > intVector < 5 , 9 , 4 , 7 , 2 , 8 , 1 , 3 >;

//Declare an empty vector

vector < int > newVector ;

cout << «The values of the original vector : \n « ;

//Iterate the vector using loop to print the values

for ( int i = 0 ; i < intVector. size ( ) ; ++ i )

cout << intVector [ i ] << » « ;

cout << « \n « ;

//Initialize the result

int result = 0 ;

//Iterate the loop until the vector becomes empty

while ( ! intVector. empty ( ) )

<

/*

Find out the even numbers to insert into the newVector

and calculate the sum of the even numbers

*/

if ( intVector. back ( ) % 2 == 0 )

<

result + = intVector. back ( ) ;

newVector. push_back ( intVector. back ( ) ) ;

>

//Remove element from the end of the intVactor

intVector. pop_back ( ) ;

>

cout << «The values of the new vector : \n « ;

//Iterate the vector using loop to print the values

for ( int i = 0 ; i < newVector. size ( ) ; ++ i )

cout << newVector [ i ] << » « ;

cout << « \n « ;

cout << «The sum of all even numbers : « << result << ‘ \n ‘ ;

return 0 ;

>

Следующий вывод появится после выполнения вышеуказанного кода. В первом векторе было три четных числа. Есть 8, 2 и 4.

Читать:
Как сохранить файл c

В первом векторе было три четных числа. Есть 8, 2 и 4

Пример 3: проверьте, удален ли последний элемент вектора

Ранее упоминалось, что pop_back () не удаляет элементы из вектора навсегда, а удаляет элемент только за счет уменьшения размера вектора. Таким образом, удаленный элемент остается в той же позиции, пока размер вектора не увеличится и не заменит элемент другим элементом. Создайте файл C ++ со следующим кодом, чтобы проверить, существует ли элемент, удаленный функцией pop_back (), или нет. Последняя позиция исходного вектора была напечатана до и после использования функции pop_back ().

#include <iostream>

#include <vector>

using namespace std ;

int main ( )

<

//Declare a vector of integer data

vector < int > intVector < 54 , 19 , 46 , 72 , 22 , 83 , 10 , 53 >;

//Declare an empty vector

vector < int > newVector ;

//Declare an integer variable

int length ;

//Print the last element based on the size of the vector

length = intVector. size ( ) ;

cout << «The current size of the vector:» << length << « \n « ;

cout << «The last value of the vector before remove:» << intVector [ length — 1 ] << « \n « ;

//Remove the element from the end of the vector

intVector. pop_back ( ) ;

//Print the last element based the size of the vector after remove

length = intVector. size ( ) ;

cout << «The current size of the vector:» << length << « \n « ;

cout << «The last value of the vector after remove:» << intVector [ length ] << « \n « ;

return 0 ;

>

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

Выходные данные показывают, что размер вектора уменьшился на 1

Заключение

В этом руководстве на простых примерах описаны три различных использования функции pop_back (). Основная цель использования этой функции будет понятна читателям после практики примеров из этого руководства.

Pop back c что делает

Vectors are same as dynamic arrays with the ability to resize itself automatically when an element is inserted or deleted, with their storage being handled automatically by the container.

push_back() function is used to push elements into a vector from the back. The new value is inserted into the vector at the end, after the current last element and the container size is increased by 1.

Syntax:

Examples:

Errors and Exceptions
1. Strong exception guarantee – if an exception is thrown, there are no changes in the container.
2. If the value passed as argument is not supported by the vector, it shows undefined behavior.

pop_back() function is used to pop or remove elements from a vector from the back. The value is removed from the vector from the end, and the container size is decreased by 1.

Syntax :

Examples:

Errors and Exceptions

1. No-Throw-Guarantee – If the container is not empty, the function never throws exceptions.
2. If the vector is empty, it shows undefined behavior.

Does pop_back() removes values along with elements ?

When pop_back() function is called, element at the last is removed, values and elements are one of the same thing in this case. The destructor of the stored object is called, and length of the vector is removed by 1. If the container’s capacity is not reduced, then you can still access the previous memory location but in this case, there is no use of accessing an already popped element, as it will result in an undefined behavior.

Application: push_back() and pop_back()

Given an empty vector, add integers to it using push_back function and then calculate its size.

Algorithm

1. Add elements to the vector using push_back function
2. Check if the size of the vector is 0, if not, increment the counter variable initialized as 0, and pop the back element.
3. Repeat this step until the size of the vector becomes 0.
4. Print the final value of the variable.

pop_back() return value?

Why doesn’t pop_back() have a return value? I have Googled regarding this and found out that it makes it more efficient. Is this the only reason for making it so in the standard?

8 Answers 8

Efficiency has little (or nothing, really) to do with it.

This design is the outcome of an important paper by Tom Cargill, published in the 90s, that raised quite a few eyebrows back then. IIRC, in it Cargill showed that it is impossible to design an exception safe stack pop function.

I think there is something related to the fact that copying an instance of the last object could throw an exception. When doing so, you’re losing your object, since pop_back() did remove it from your container. Better with a few lines of code:

Efficiency is one thing. Another reason for pop_back() not returning an element is exception safety.
If the pop() function returned the value, and an exception is thrown by the copy constructor, you may not be able to guarantee that the container is in the same state as it was before calling pop() .

You can find more infos in Herb Sutters books about exceptions. I think this topic is covered here. But I am not sure.

Well, how many reasons there have to be?

This avoids potentially expensive copying of the object when you just want to remove it from the container. C++ has the philosophy of not paying for what you don’t need.

The reason is not so much efficiency as exception safety. The container class can be used to store any kind of objects. It would be impossible to implement pop_back() in an exception safe manner if the function would return the object after deleting it from the container, because returning the value of the object involves copy construction.

This is the actual implementation of vector::pop_back() in GNU C++ standard library:

This is what it would look like should it return the last element in the end:

This involves two copy constructions, at the save = back() statement and when returning a copy of the object. There are no guarantees that the return expression won’t throw an exception after the element has been destroyed from the container.

Related Posts