Как обратиться к последнему элементу вектора c
На этом шаге мы рассмотрим особенности обращения к элементам вектора .
В таблице 1 перечислены все операции прямого обращения к элементам векторов. Как принято в С и C++ , первому элементу вектора соответствует индекс 0, а последнему — индекс size()-1 . Таким образом, n -му элементу соответствует индекс n -1. Для неконстантных векторов эти операции возвращают ссылку на элемент и поэтому могут использоваться для модификации элементов (при условии, что модификация не запрещена по другим причинам).
| Операция | Описание |
|---|---|
| c.at(idx) | Возвращает элемент с индексом idx (при недопустимом значении индекса генерируется исключение out_of_range ) |
| c[idx] | Возвращает элемент с индексом idx (без интервальной проверки!) |
| c.front() | Возвращает первый элемент (без проверки его существования!) |
| c.back() | Возвращает последний элемент (без проверки его существования!) |
Самый важный аспект для вызывающей стороны — наличие или отсутствие интервальной проверки при обращении к элементу. Такая проверка выполняется только функцией at() . Если индекс не входит в интервал допустимых значений, генерируется исключение out_of_range (смотри 47 шаг). Остальные функции выполняются без проверки , и интервальные ошибки приводят к непредсказуемым последствиям. Вызов оператора [], функций front() и back() для пустого контейнера всегда приводит к непредсказуемым последствиям.
std::vector coll; // Пустой вектор! coll[5] = elem; // ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ std::cout // ОШИБКА ВРЕМЕНИ ВЫПОЛНЕНИЯ
Следовательно, перед вызовом оператора [] необходимо убедиться в том, что индекс имеет допустимое значение, а перед вызовом функции front() или back() — что контейнер не пуст:
std::vector coll; // Пустой вектор! if (coll.size() > 5) < coll[5] = elem; // OK > if (!coll.empty()) < cout // OK > coll.at(5) = elem; // Генерирует исключение out_of_range
На следующем шаге мы рассмотрим функции получения итераторов .
Как обратиться к последнему элементу вектора c
Вектор представляет контейнер, который содержит коллекцию объектов одного типа. Для работы с векторами необходимо включить заголовок:
#include
Определим простейший вектор:
std::vector numbers;
В угловых скобках указывается тип, объекты которого будут храниться в векторе. То есть вектор numbers хранит объекты типа int. Однако такой вектор пуст. Он не содержит никаких элементов.
Но мы можем инициализировать вектор одним из следующих способов:
std::vector v1; // пустой вектор std::vector v2(v1); // вектор v2 - копия вектора v1 std::vector v3 = v1; // вектор v3 - копия вектора v1 std::vector v4(5); // вектор v4 состоит из 5 чисел, каждое число равно 0 std::vector v5(5, 2); // вектор v5 состоит из 5 чисел, каждое число равно 2 std::vector v6; // вектор v6 состоит из чисел 1, 2, 4, 5 std::vector v7 = ; // вектор v7 состоит из чисел 1, 2, 3, 5
Важно понимать отличие в данном случае круглых скобок от фигурных:
std::vector v1(5); // вектор состоит из 5 чисел, каждое число в векторе равно 0 std::vector v2; // вектор состоит из одного числа, которое равно 5 std::vector v3(5, 2); // вектор состоит из 5 чисел, каждое число равно 2 std::vector v4; // вектор состоит из двух чисел 5 и 2
При этом можно хранить в векторе элементы только одного типа, который указан в угловых скобках. Значения других типов в вектор сохранить нельзя, как например, в следующем случае:
std::vector v;
Обращение к элементам и их перебор
Для обращения к элементам вектора можно использовать разные способы:
- [index] : получение элемента по индексу (также как и в массивах), индексация начинается с нуля
- at(index) : функция возращает элемент по индексу
- front() : возвращает первый элемент
- back() : возвращает последний элемент
Выполним перебор вектора и получим некоторые его элементы:
#include #include int main() < std::vectornumbers ; int first = numbers.front(); // 1 int last = numbers.back(); // 5 int second = numbers[1]; // 2 std::cout << "first: " << first << std::endl; std::cout << "second: " << second << std::endl; std::cout << "last: " << last << std::endl; numbers[0] = 6; // изменяем значение for(int n : numbers) std::cout << n << "\t"; // 6 2 3 4 5 std::cout
При этом следует учитывать, что индексация не добавляет элементов. Например, если вектор содержит 5 элементов, то мы не можем обратиться к шестому элементу:
std::vector numbers ; numbers[5] = 9;
При таком обращении результат неопределен. Некоторые комиляторы могут генерировать ошибку, некоторые продолжат работать, но даже в этом случае такое обращение будет ошибочно, и оно в любом случае не добавит в вектор шестой элемент.
Чтобы избежать подобных ситуаций, можно использовать функцию at() , которая хотя также возвращает элемент по индексу, но при попытке обращения по недопустимому индексу будет генерировать исключение out_of_range :
#include #include #include int main() < std::vectornumbers < 1, 2, 3, 4, 5>; try < int n = numbers.at(8); >catch (std::out_of_range e) < std::cout >
Доступ к последнему элементу вектора векторов в 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 золотых знака 33 33 серебряных знака 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 (), которая возвращает последний элемент вектора:

В результате этой команды на экране должно появиться значение последнего элемента вектора c, в нашем случае – 30.