C++ <vector> функция push_back

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


Среди множества контейнеров,vector(vector) — наиболее часто используемый и наиболее похожий на автоматически расширяемый массив, в то время какpush_back— ключевая функция, которая делает этот массив расширяемым.

push_back— это функция-член, используемая длядинамических массивов (vector)илиДругие последовательные контейнеры (такие какlist, deque)изконцадобавить новый элемент.

push_backреализоватьдинамический ростконтейнера, вам не нужно заранее задавать конечный размер контейнера; вы можете добавлять элементы в любое время по мере необходимости во время выполнения программы.

Определения слов: push— это проталкивание,back— это "back/push", поэтому вместе это означает "протолкнуть в конец" — очень интуитивно понятно.


базовый синтаксис и параметры

push_back— это функция-член классов контейнеров, поэтому сначала нужно иметь объект контейнера, а затем использовать оператор точки.чтобы вызвать её.

Формат синтаксиса

void push_back(const T& value);
void push_back(T&& value);  // C++11 之后(支持右值)

Описание параметра

  • Параметр: value
    • Тип: такой же, как тип элемента, указанный при определении контейнера, или значение, которое может быть преобразовано в этот тип.
    • Описание: значение, которое вы хотите добавить в конец контейнера. Это может быть переменная, литерал (например,10, "hello") или результат выражения.

Описание функции

  • Возвращаемое значение: void(нет возвращаемого значения). Его назначение — исключительно "добавить элемент"; как только добавление завершено, функция заканчивается.
  • Влияниена контейнерsize()(текущее количество элементов) увеличивается на 1. Новый элемент становится последним элементом контейнера.

Пример

Давайте тщательно освоим это на серии примеров от простых до сложных.push_backИспользование.

Пример 1: Базовое использование — работа с целыми числами

Пример

#include <iostream>
#include <vector> // 1. Необходимо включить заголовочный файл vector

int main() {
    // 2. Создайте пустой вектор для хранения целых чисел
    std::vector<int> numbers;

    std::cout << "Изначально размер вектора равен: " << numbers.size() << std::endl;

    // 3. Используйте push_back для добавления элементов
    numbers.push_back(10); // Добавить целое число 10 в конец
    numbers.push_back(20); // Добавить 20 после 10
    numbers.push_back(30); // Добавить 30 после 20

    std::cout << "После добавления размер вектора равен: " << numbers.size() << std::endl;

    // 4. Пройдите по всем элементам и выведите их, чтобы проверить порядок добавления
    std::cout << "Элементы вектора: ";
    for(int i = 0; i < numbers.size(); ++i) {
        std::cout << numbers[i] << " "; // Доступ по индексу, как к массиву
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

初始时,vector的大小是: 0
添加后,vector的大小是: 3
vector中的元素是: 10 20 30

Анализ кода:

  1. #include <vector>заключается в использованииvectorпредварительное условие контейнера.
  2. std::vector<int> numbers;создали один с именемnumbersпустогоvector, который в будущем будет хранитьintцелые числа типа.
  3. три разаpush_backвызов, последовательно10, 20, 30добавить вnumbersв конце. Порядок добавления — это порядок, в котором элементыvectorв окончательном порядке.
  4. numbers.size()возвращает текущее количество элементов.numbers[i]Используйте индексы для доступа к элементам, так же как при использовании массива.

Пример 2: Управление строками

vectorОн может хранить не только числа, но и строки, пользовательские типы и любые другие типы данных.

Пример

#include <iostream>
#include <vector>
#include <string> // Также необходимо подключить заголовочный файл, чтобы использовать string

int main() {
    // Создайте вектор, который хранит std::string
    std::vector<std::string> tasks;

    // Используйте push_back для добавления задач
    tasks.push_back("Learn C++ push_back");
    tasks.push_back("Сделать домашнее задание");
    tasks.push_back("Читать техническую документацию");

    std::cout << "Задачи на сегодня (" << tasks.size() << " item):\n";
    // Используйте цикл for по диапазону (C++11) для обхода, что более кратко
    for(const auto& task : tasks) {
        std::cout << "- " << task << std::endl;
    }

    return 0;
}

Ожидаемый вывод:

今日待办事项 (3 项):
- 学习 C++ push_back
- 写作业
- 阅读技术文档

Анализ кода:

  • std::vector<std::string>объявляет тип элемента какstd::stringcontainer.
  • push_backПараметр теперь — строковый литерал (который автоматически преобразуется вstd::string)。
  • for(const auto& task : tasks)— это "цикл for по диапазону", представленный в C++11; он автоматически перебираетtasksкаждый элемент в нём — это очень удобно.autoпусть компилятор автоматически выведетtaskтип.

Пример 3: Динамическое формирование содержимого контейнера

Этоpush_backСамая мощная сторона: создание контейнеров на основе данных времени выполнения (таких как ввод пользователя, чтение файлов).

Пример

#include <iostream>
#include <vector>

int main() {
    std::vector<int> scores;
    int inputScore;
    char continueFlag = 'y';

    std::cout << "Пожалуйста, введите оценки студентов (введите нецифровой символ для завершения):\n";
    // Способ 1: определить цикл на основе ввода пользователя
    while(std::cin >> inputScore) {
        scores.push_back(inputScore);
    }

    // Очистить состояние ошибки cin, чтобы разрешить возможный последующий ввод
    std::cin.clear();
    std::cin.ignore(10000, '\n');

    // Способ 2: Спросить, продолжать ли
    /*
    while(continueFlag == 'y' || continueFlag == 'Y') {
std::cout << "Введите балл: ";
        std::cin >> inputScore;
        scores.push_back(inputScore);

std::cout << "Продолжить ввод? (y/n): ";
        std::cin >> continueFlag;
    }
    */


    std::cout << "\nВсего " << scores.size() << " баллов.\n";
    if(!scores.empty()) { // Проверить, пуст ли контейнер
        int sum = 0;
        for(int score : scores) {
            sum += score;
        }
        std::cout << "Средний балл: " << static_cast<double>(sum) / scores.size() << std::endl;
    }

    return 0;
}

Этот пример показывает, как использоватьpush_backдинамически заполнить контейнер в цикле и в конце вычислить среднее. Можно попробовать запустить и ввести100 90 85 a(в конце введите буквуaчтобы завершить цикл ввода чисел).


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

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