Функция back в C++ <vector>
В различных операциях с vector,backявляется очень практичной функцией, используемой дляполучения последнего элемента。
backявляется функцией-членом контейнерных классов, используется длявозврата последнего элемента контейнера. Она эквивалентнаat(size()-1)илиoperator[](size()-1), но с более ясной семантикой.
backон предоставляет интуитивный способ доступа к последнему элементу контейнера, часто используется при реализации таких структур данных, как стеки и очереди.
Определения слов: backЭто означает "back", то есть получить последний (самый задний) элемент.
Базовый синтаксис и параметры
backЭто функция-член контейнерных классов; её вызов очень прост и не требует параметров.
Формат синтаксиса
reference back(); const_reference back() const;
Описание параметра
- Параметр: Нет параметров
backне принимает никаких параметров.
Описание функции
- Возвращаемое значение: возвращаетссылкуна последний элемент контейнера. Если контейнер является const-контейнером, возвращается const-ссылка.
- Действие: Возвращает последний элемент контейнера (индекс
size()-1элемента с индексом). - Примечание: вызов
backПеред [использованием] убедитесь, что контейнер не пуст; в противном случае поведение не определено. Рекомендуется сначала использоватьempty()илиsize() > 0Проверьте.
Пример
Давайте тщательно освоим [это] на серии примеров.backИспользование.
Пример 1: Базовое использование - получить последний элемент
Пример
#include <vector>
int main() {
// 1. Создайте вектор и добавьте несколько элементов
std::vector<int> numbers = {10, 20, 30, 40, 50};
std::cout << "Размер вектора: " << numbers.size() << std::endl;
// 2. Используйте back() для получения последнего элемента
std::cout << "Последний элемент (back): " << numbers.back() << std::endl;
std::cout << "Использование at(size()-1): " << numbers.at(numbers.size() - 1) << std::endl;
std::cout << "Использование [size()-1]: " << numbers[numbers.size() - 1] << std::endl;
return 0;
}
Ожидаемый вывод:
vector的大小是: 5 最后一个元素 (back): 50 使用 at(size()-1): 50 使用 [size()-1]: 50
Анализ кода:
numbers.back()возвращает последний элемент50。- Он и
numbers.at(numbers.size()-1)иnumbers[numbers.size()-1]возвращает то же значение, но с более явной семантикой.
Пример 2: Изменить значение последнего элемента
backОн возвращает ссылку, поэтому его можно использовать для изменения значения элемента.
Пример
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks = {"Изучить C++", "Сделать домашнее задание", "Читать документацию"};
std::cout << "Перед изменением последняя задача: " << tasks.back() << std::endl;
// Используйте back(), чтобы получить ссылку и изменить элемент
tasks.back() = "Завершить проект";
std::cout << "После изменения последняя задача: " << tasks.back() << std::endl;
// Теперь содержимое tasks: learn C++, do homework, complete the project
return 0;
}
Ожидаемый вывод:
Before modification, last task: read documentation. After modification, last task: complete project.
Анализ кода:
tasks.back() = "完成项目";Значение последнего элемента изменяется через ссылку.back()возвращает изменяемую lvalue-ссылку.
Пример 3: Безопасное использование back - проверка, пуст ли контейнер
При использованииbackПеред этим следует сначала проверить, пуст ли контейнер.
Пример
#include <vector>
void printBack(const std::vector<int>& v) {
if(!v.empty()) {
std::cout << Последний элемент: << v.back() << std::endl;
}
else {
std::cout << Контейнер пуст, невозможно получить последний элемент << std::endl;
}
}
int main() {
std::vector<int> numbers = {10, 20, 30};
// Обычный случай
printBack(numbers);
// Случай с пустым контейнером
std::vector<int> emptyVec;
printBack(emptyVec);
return 0;
}
Ожидаемый вывод:
最后一个元素是: 30 容器为空,无法获取最后一个元素
Анализ кода:
!v.empty()проверить, не пуст ли контейнер.- При вызове
backПроверка перед [использованием] позволяет избежать неопределённого поведения.
Пример 4: Реализация стека с использованием back
backчасто используется для реализации стековых структур данных (вместе сpush_backиpop_back)。
Пример
#include <vector>
class Stack {
private:
std::vector<int> data;
public:
// Добавить
void push(int value) {
data.push_back(value);
}
// Извлечь
void pop() {
if(!data.empty()) {
data.pop_back();
}
}
// Получить верхний элемент стека
int top() {
if(!data.empty()) {
return data.back();
}
return 0; // Указывает, что стек пуст
}
// Проверить, пуст ли стек
bool empty() {
return data.empty();
}
// Получить размер стека
size_t size() {
return data.size();
}
};
int main() {
Stack s;
// Операция push
s.push(10);
s.push(20);
s.push(30);
std::cout << Размер стека: << s.size() << std::endl;
std::cout << Верхний элемент (back): << s.top() << std::endl;
// Операция pop
s.pop();
std::cout << После извлечения верхний элемент: << s.top() << std::endl;
s.pop();
std::cout << После повторного извлечения верхний элемент: << s.top() << std::endl;
s.pop();
std::cout << После повторного извлечения стек пуст: << (s.empty() ? Да : Нет) << std::endl;
return 0;
}
Ожидаемый вывод:
栈的大小: 3 栈顶元素 (back): 30 出栈后,栈顶元素: 20 再出栈后,栈顶元素: 10 再出栈后,栈是否为空: 是
Анализ кода:
back()Используется для получения верхнего элемента стека (элемента, добавленного последним).- Стек — это структура данных, работающая по принципу «последним пришёл — первым вышел» (LIFO),
back()Точно соответствует вершине стека.
Пример 5: Динамическое получение максимального значения
ИспользованиеbackКоординацияsortПолучить максимальный элемент после сортировки.
Пример
#include <vector>
#include <algorithm>
#include <ctime>
#include <cstdlib>
int main() {
std::srand(std::time(nullptr));
std::vector<int> numbers;
// Случайно сгенерировать 5 чисел
for(int i = 0; i < 5; ++i) {
numbers.push_back(std::rand() % 100);
}
std::cout << Исходные данные:;
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
// Сортировка
std::sort(numbers.begin(), numbers.end());
std::cout << "После сортировки: ";
for(int n : numbers) {
std::cout << n << " ";
}
std::cout << std::endl;
std::cout << Минимальное значение (front): << numbers.front() << std::endl;
std::cout << Максимальное значение (back): << numbers.back() << std::endl;
return 0;
}
Анализ кода:
- После сортировки,
front()Возвращает минимальное значение,back()Возвращает максимальное значение. - Это простой способ получить максимальное/минимальное значение.
Другие расширения