Функция back в C++ <vector>

класс контейнера 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 <iostream>
#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

Анализ кода:

  1. numbers.back()возвращает последний элемент50。
  2. Он иnumbers.at(numbers.size()-1)иnumbers[numbers.size()-1]возвращает то же значение, но с более явной семантикой.

Пример 2: Изменить значение последнего элемента

backОн возвращает ссылку, поэтому его можно использовать для изменения значения элемента.

Пример

#include <iostream>
#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 <iostream>
#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 <iostream>
#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 <iostream>
#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()Возвращает максимальное значение.
  • Это простой способ получить максимальное/минимальное значение.

класс контейнера C++ <vector>

Другие расширения