Операции с векторами в STL
Размер вектора можно узнать при помощи универсального метода size() , возвращающего для всех контейнеров в STL их размер. Также есть метод empty() , возвращающий логическое значение ( true , если вектор пустой).
Размер вектора можно изменить в любой момент, при помощи метода resize . У этого метода может быть один или два параметра. Вызов метода resize(n) изменяет размер вектора до n элементов (длина вектора может как уменьшится, так и увеличиться). Вызов метода resize(n, val) изменяет размер вектора до n элементов, и если при этом размер вектора увеличивается, то новые элементы получают значение, равное val.
Очень часто бывает полезно добавлять элементы в конец вектора по одному и удалять элементы из конца вектора по одному. Для добавления нового элемента, равного val в конец вектора используется метод push_back(val) . Для удаления последнего элемента вектора используется метод pop_back() — он не возвращает значения.
Добавление элемента в конец вектора осуществляется в среднем за O(1). Это реализовано за счет того, что память для хранения элементов вектора выделяется “с запасом”, то есть можно будет добавлять элементы по одному, пока не кончится запас памяти. Если запас памяти исчерпан, выделяется новая память, при этом «запас» размера вектора удваивается.
Очистить вектор можно при помощи метода clear() .
Вставка и удаление элементов в середину вектора
Для удаления и вставки элементов в середину вектора используются методы erase и insert . В качестве параметра им нужно передавать итератор, поэтому просто покажем на примере, как их использовать.
Итератор — специальный объект, указывающий на элемент вектора (или другой структуры данных). Итератор на элемент с индексом i можно получить при помощи выражения a.begin() + i . Кроме того, можно при помощи итератора a.end() “отсчитывать” элементы, начиная с конца. При этом a.end() будет итератором на элемент, следующий за последним, a.end() будет итератором на последний элемент, то есть то же самое, что a.begin() + a.size() — 1 , a.end() — 2 — второй элемент с конца и т.д.
Удаление элементов: метод erase
Метод erase позволяет удалять из середины вектора один или несколько элементов. Если вызвать метод erase с одним параметром–итератором, то будет удален соответствующий элемент из вектора, то есть для удаления элемента с индексом i из вектора a нужно вызвать метод следующим образом:
a.erase(a.begin() + i);
Методу erase передать два итератора на начало и конец удаляемого фрагмента, например:
a.erase(a.begin() + i, a.begin() + j);
В этом случае будут удалены элементы с индексами от i (включительно) до j не включительно, то есть элементы a[i] , a[i + 1] , . a[j — 1] . Всего будет удалено j — i элементов.
Методу erase можно передавать и итераторы, полученные относительно итератора end . Например, удалить из вектора три последних элемента можно так:
a.erase(a.end() - 3, a.end());
Подробней про его использование можно прочитать в документации.
Вставка элементов: метод insert
Метод insert позволяет вставлять в середину вектора новый элемент, или несколько равных элементов, или другой вектор, или фрагмент другого вектора. Этот метод также работает с итераторами и про его использование можно прочитать в документации.
Примеры использования метода insert :
Вставка одного элемента со значением val в позицию с индексом i :
a.insert(a.begin() + i, val);
Вставка нескольких равных (количеством count ) элементов со значением val в позицию с индексом i :
a.insert(a.begin() + i, count, val);
Вставка в вектор a в позицию с индексом i фрагмент вектора b с индексами от start включительно до finish не включительно:
a.insert(a.begin() + i, b.begin() + start, b.begin() + finish);
В качестве параметром могут использоваться произвольные итераторы. Рассмотрим несколько примеров:
Весь вектор b добавить в конец вектора a :
a.insert(a.end(), b.begin(), b.end());
Последние 5 элементов вектора b вставить в начало вектора a :
a.insert(a.begin(), b.end() - 5, b.end());
Поскольку вставка и удаление элементов требуют сдвига других элементов вектора, эти операции имеют линейную сложность, то есть выполняются за время, пропорциональное длине вектора.
Присваивание и сравнение векторов
Содержимое одного вектора можно целиком скопировать в другой вектор при помощи операции присваивания. При этом размер вектора A автоматически изменится и будет равен размеру вектора B . A = B .
Также векторы можно сравнивать на равенство и неравенство ( A == B , A != B ), и сравнивать их содержимое в лексикографическом порядке ( A < B , A B , A >= B ).
Вывести последний элемент вектора
Поставить последний элемент вектора в середину
У меня получилось что просто происходит замена элемента с середины с последним элементом.
Найти максимальный элемент массива и вывести последний четный элемент
Короче нужно чтобы програма нашла максимальный елемент масива и выводила на екран последное четное.
Напишите программу, которая циклически сдвигает элементы вектора вправо. Последний элемент встаёт в начало
Напишите программу, которая циклически сдвигает элементы вектора вправо. Последний элемент встаёт в.
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
Сообщение от kre-sod
а вот как обратиться к последнему элементу?
Доступ к последнему элементу вектора векторов в c++
Есть вектор векторов vector
double a = vec.back().back();
Компилятор не ругается, но программа на этой строке вылетает. Как можно получить этот элемент?
Отслеживать
задан 1 сен 2022 в 12:46
83 8 8 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Вам еще надо бы учесть, что вектор может быть пустым — тогда программа будет вылетать на такой строке (хоть формально, она и верная).
Можно поступить так:
if( !vec.empty() && !vec.back().empty() )
Отслеживать
ответ дан 1 сен 2022 в 12:52
22.3k 2 2 золотых знака 34 34 серебряных знака 53 53 бронзовых знака
Это и правда помогло! Спасибо)
1 сен 2022 в 13:27
В дополнение к ответу gbg: Я бы вынес всё это в функцию и добавил бы исключение при неправильном параметре.
#include #include #include using namespace std; double get_last_of_last(vector>& vec) < if (vec.empty() || vec.back().empty()) < throw runtime_error("unvalid parameter"); >return vec.back().back(); > int main() < vector> vec = < , , >; cout
Отслеживать
ответ дан 1 сен 2022 в 13:28
583 2 2 серебряных знака 14 14 бронзовых знаков
Нехороший конструктор исключения, принимающий строку. И почему код возврата такой?
1 сен 2022 в 14:02
std::exception не имеет конструктора от строки, это самодеятельность студии. Нужно std::runtime_error или что-то такое.
1 сен 2022 в 17:30
@HolyBlackCat, исправил. Спасибо за разъяснение. Всё время мне про плохой конструктор говорили, я думал, что нужно какой-то другой конструктор использовать.. Только вот их всего 4 (visual studio 2019), а нужный мне только 1 и он принимает строку. Наконец-то понял.
Как вывести последний элемент вектора c
Узнайте, как можно вывести последний элемент вектора на языке программирования C. Простой и эффективный способ без дополнительной библиотеки. Начните использовать в своем коде уже сегодня!
Вектор – это динамический массив элементов в языке программирования С++. Один из многих преимуществ использования вектора вместо статического массива заключается в его динамической возможности изменяться в размере во время выполнения программы. В этой статье мы рассмотрим, как вывести последний элемент вектора c используя стандартную библиотеку С++.
Для начала, необходимо создать вектор c, содержащий несколько элементов. Для этого мы можем использовать функцию push_back (), которая добавляет элемент в конец вектора. Таким образом, наш вектор c может быть определен следующим образом:
std::vector c;
c.push_back(10);
c.push_back(20);
c.push_back(30);
Теперь мы можем вывести последний элемент вектора c, используя функцию back (), которая возвращает последний элемент вектора:
Читать далее«Арбуз кримсон руби F1: отзывы, сроки и правила посадки».
В результате этой команды на экране должно появиться значение последнего элемента вектора c, в нашем случае – 30.