pop back c что делает
pop_back () в односвязном списке в C ++
Я написал следующую реализацию Singlely Linked List. Одна проблема, с которой я сталкиваюсь, заключается в том, что я хочу pop_back() удалить последний узел, а затем установить tail на второй последний узел в O (1). Теперь проблема не в двусвязном списке, и поэтому у меня нет доступа ко второму последнему узлу без выполнения цикла. Я сделал push_back() в O (1). Как мне сделать pop_back() в O (1) в этом коде?
3 ответа
Вы не можете с одним связанным списком, давайте реализуем ваш
Вам нужна функция для поиска позиции, которая подразумевает, что вы также должны знать, сколько в ней позиции, в этом случае pos имеет размер-1 (-2, если вы используете нулевое смещение) или искать узел, который имеет pos в качестве следующего узел. Вы можете использовать большую часть кода в erase для его реализации.
Теперь эта новая находка будет иметь O (и), которая является проклятием одиночных связанных списков.
Объяснение
Если вы действительно хотите сделать это в O (1) и хотите сохранить единый список, вы можете подумать о сохранении второго последнего узла в дополнение к последнему узлу.
Но, помимо превращения в организационный ужас, он все равно не сработает. Конечно, в pop_back вы можете просто delete tail; и установить хвост для второго последнего элемента. Но теперь вам все равно потребуется цикл для определения нового второго последнего элемента.
Это даже плохо?
К сожалению, вы не можете сделать это за O (1) раз, так как нет никакого способа сделать это, вы должны компенсировать производительность памяти и использовать двойной связанный список. Если у вас есть возможность использовать другие структуры данных, я бы предложил вам использовать Deque
Deque C++ функция pop_back
Здравствуйте! Я написала код:
Ошибки в push_back и pop_back
Задали финальный проект на Linked List, но тему эту по сути не очень хорошо успела освоить. Знаю.
stl::vector, метод pop_back()
Доброго времени суток! Вот такой вопрос: я создаю объект в куче: someClass *test =.
Нужен функционал push_back и pop_back в паскале
Здравствуйте, я переписываю программу с С++ на паскаль. У меня вот такая функция есть: void.
Решение
Отличие erase() и pop_back() при работе с std::vector
При использовании функций ersae() и pop_back() происходит различие по времени исполнения операции.
STL deque
Устройство, основные операции и их стоимость, особенности использования deque. Ни где не могу.
Контейнер deque
Задание:(используя контейнер deque) ввести последовательность натуральных чисел,у конце которой.
std::deque
Как известно при добавлении в конец вектора элементов(и не только в конец) может возникнуть.
сортировка deque
Здравствуйте, форумчане. Выполнял задание и вот стало ясно, что надо отсортировать деку(дали, как.
Векторы в C++: для начинающих
Всем привет! До этого дня мы использовали чистые массивы. Чистые — это значит простые массивы, не имеющие у себя в багаже различных функций. В этом уроке мы пройдем нечистые массивы — векторы.
Быстрый переход по статье:
Что такое вектор (vector)
Вектор — это структура данных, которая уже является моделью динамического массива.
Давайте вспомним о том, что для создания динамического массива (вручную) нам нужно пользоваться конструктором new и вдобавок указателями. Но в случае с векторами всего этого делать не нужно.
Вообще, по стандарту пользоваться динамическим массивом через конструктор new — не есть правильно. Так как в компьютере могут происходить различные утечки памяти.
Как создать вектор (vector) в C++
Кстати, сейчас и в будущем мы будем использовать именно шаблон вектора. Например, очередь или стек, не созданные с помощью массива или вектора, тоже являются шаблонными.
Далее, чтобы объявить вектор, нужно пользоваться конструкцией ниже:
В примере выше мы создали вектор строк.
Кстати, заполнить вектор можно еще при инициализации (другие способы мы пройдем позже — в методах вектора). Делается это также просто, как и в массивах. Вот так:
После имени вектора ставим знак равенства и скобки, в которых через пробел указываем значение элементов.
Такой способ инициализации можно использовать только в C++!
Второй способ обратиться к ячейке
Но в C++ есть еще один способ это сделать благодаря функции — at(). В скобках мы должны указать индекс той ячейки, к которой нужно обратиться.
Вот как она работает на практике:
Давайте запустим эту программу:
Как указать количество ячеек для вектора
Указывать размер вектора можно по-разному. Можно это сделать еще при его инициализации, а можно хоть в самом конце программы. Вот, например, способ указать длину вектора на старте:
Так в круглых скобках () после имени вектора указываем первоначальную длину. А вот второй способ:
Вы можете задать логичный вопрос:»А в чем разница?». Давайте создадим два вектора и по-разному укажем их количество ячеек.
Как видим, в первом случае мы вывели три нуля, а во втором: 17, 0, 0.
Все потому, что при использовании первого способа все ячейки автоматически заполнились нулями.
При объявлении чего-либо (массива, вектора, переменной и т.д) мы выделяем определенное количество ячеек памяти, в которых уже хранится ненужный для ПК мусор. В нашем случае этим мусором являются числа.
Поэтому, когда мы вывели второй вектор, в нем уже находились какие-то рандомные числа — 17, 0, 0. Обычно они намного больше. Можете кстати попробовать создать переменную и вывести ее значение.
Нужно помнить! При использовании второго способа есть некоторый плюс — по времени. Так как для первого способа компилятор тратит время, чтобы заполнить все ячейки нулями.
Как сравнить два вектора
Если в середине программы нам понадобиться сравнить два массива, мы, конечно, используем цикл for и поочередно проверим все элементы.
Вектор снова на шаг впереди! Чтобы нам сравнить два вектора, потребуется применить всего лишь оператор ветвления if.
Урок №106. Ёмкость вектора
Обновл. 13 Сен 2021 |
Мы уже знаем, что такое std::vector в языке С++ и как его можно использовать в качестве динамического массива, который запоминает свою длину и длина которого может быть динамически изменена по мере необходимости. Хотя использование std::vector в качестве динамического массива — это самая полезная и наиболее часто применяемая его особенность, но он также имеет и некоторые другие способности, которые также могут быть полезными.
Длина vs. Ёмкость
Рассмотрим следующий пример:
Мы можем сказать, что длина массива равна 12, но используется только 7 элементов (которые мы, собственно, выделили).
А что, если мы хотим выполнять итерации только с элементами, которые мы инициализировали, оставляя в резерве неиспользованные элементы для будущего применения? В таком случае нам потребуется отдельно отслеживать, сколько элементов было «использовано» из общего количества выделенных элементов. В отличие от фиксированного массива или std::array, которые запоминают только свою длину, std::vector имеет два отдельных свойства:
Длина в std::vector — это количество фактически используемых элементов.
Ёмкость (или «вместимость») в std::vector — это количество выделенных элементов.
Рассмотрим пример из урока о std::vector:
Результат выполнения программы:
The length is: 6
0 1 2 3 0 0
В примере, приведенном выше, мы использовали функцию resize() для изменения длины вектора до 6 элементов. Это сообщает массиву, что мы намереваемся использовать только первые 6 элементов, поэтому он должен их учитывать, как активные (те, которые фактически используются). Следует вопрос: «Какова ёмкость этого массива?».
Мы можем спросить std::vector о его ёмкости, используя функцию capacity():
Результат на моем компьютере:
The length is: 6
The capacity is: 6
В этом случае функция resize() заставила std::vector изменить как свою длину, так и ёмкость. Обратите внимание, ёмкость всегда должна быть не меньше длины массива (но может быть и больше), иначе доступ к элементам в конце массива будет за пределами выделенной памяти!
Зачем вообще нужны длина и ёмкость? std::vector может перераспределить свою память, если это необходимо, но он бы предпочел этого не делать, так как изменение размера массива является несколько затратной операцией. Например:
Результат выполнения программы:
length: 6 capacity: 6
length: 4 capacity: 6
Обратите внимание, хотя мы присвоили меньшее количество элементов массиву во второй раз — он не перераспределил свою память, ёмкость по-прежнему составляет 6 элементов. Он просто изменил свою длину. Таким образом, он понимает, что в настоящий момент активны только первые 4 элемента.
Оператор индекса и функция at()
Диапазон для оператора индекса [] и функции at() основан на длине вектора, а не на его ёмкости. Рассмотрим массив из вышеприведенного примера, длина которого равна 4, а ёмкость равна 6. Что произойдет, если мы попытаемся получить доступ к элементу массива под индексом 5? Ничего, поскольку индекс 5 находится за пределами длины массива.
Обратите внимание, вектор не будет изменять свой размер из-за вызова оператора индекса или функции at()!
std::vector в качестве стека
Если оператор индекса и функция at() основаны на длине массива, а его ёмкость всегда не меньше, чем его длина, то зачем беспокоиться о ёмкости вообще? Хотя std::vector может использоваться как динамический массив, его также можно использовать в качестве стека. Мы можем использовать 3 ключевые функции вектора, которые соответствуют 3-м ключевым операциям стека:
функция push_back() — добавляет элемент в стек.
функция back() — возвращает значение верхнего элемента стека.
функция pop_back() — вытягивает элемент из стека.
Использование функции 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 ().
using namespace std ;
//Declare a vector of string values
cout «The values of the vector : \n « ;
//Iterate the vector using loop to print the values
for ( int i = ; i flowers. size ( ) ; ++ i )
//Remove the last two values from the vector
cout « \n The values of the vector after remove : \n « ;
//Iterate the vector using loop to print the values
for ( int i = ; i flowers. size ( ) ; ++ i )
Следующий вывод появится после выполнения вышеуказанного кода.
Пример 2: Создать новый вектор из другого вектора
Создайте файл C ++ со следующим кодом для вставки определенных значений в пустой вектор из другого вектора путем удаления элементов с помощью функции pop_back (). В коде объявлены вектор из 8 целых чисел и пустой вектор целочисленного типа. Цикл while использовался для перебора каждого элемента первого вектора и вставки элемента в новый вектор, если число делится на 2. Здесь также была вычислена сумма всех четных чисел. Каждый элемент первого вектора будет удален функцией pop_back () на каждой итерации цикла, чтобы достичь условия завершения цикла.
using namespace std ;
//Declare a vector of integer data
//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 = ; i intVector. size ( ) ; ++ i )
//Initialize the result
//Iterate the loop until the vector becomes empty
Find out the even numbers to insert into the newVector
and calculate the sum of the even numbers
if ( intVector. back ( ) % 2 == )
result + = intVector. back ( ) ;
newVector. push_back ( intVector. back ( ) ) ;
//Remove element from the end of the intVactor
cout «The values of the new vector : \n « ;
//Iterate the vector using loop to print the values
for ( int i = ; i newVector. size ( ) ; ++ i )
cout «The sum of all even numbers : « result ‘ \n ‘ ;
Следующий вывод появится после выполнения вышеуказанного кода. В первом векторе было три четных числа. Есть 8, 2 и 4.
Пример 3: проверьте, удален ли последний элемент вектора
Ранее упоминалось, что pop_back () не удаляет элементы из вектора навсегда, а удаляет элемент только за счет уменьшения размера вектора. Таким образом, удаленный элемент остается в той же позиции, пока размер вектора не увеличится и не заменит элемент другим элементом. Создайте файл C ++ со следующим кодом, чтобы проверить, существует ли элемент, удаленный функцией pop_back (), или нет. Последняя позиция исходного вектора была напечатана до и после использования функции pop_back ().
using namespace std ;
//Declare a vector of integer data
//Declare an empty vector
vector int > newVector ;
//Declare an integer variable
//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
//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 « ;
Следующий вывод появится после выполнения вышеуказанного кода. Выходные данные показывают, что размер вектора уменьшился на 1, но элемент последней позиции исходного вектора все еще существует.
Заключение
В этом руководстве на простых примерах описаны три различных использования функции pop_back (). Основная цель использования этой функции будет понятна читателям после практики примеров из этого руководства.