C++ <vector> функция push_back
Среди множества контейнеров,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 <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
Анализ кода:
#include <vector>заключается в использованииvectorпредварительное условие контейнера.std::vector<int> numbers;создали один с именемnumbersпустогоvector, который в будущем будет хранитьintцелые числа типа.- три раза
push_backвызов, последовательно10,20,30добавить вnumbersв конце. Порядок добавления — это порядок, в котором элементыvectorв окончательном порядке. numbers.size()возвращает текущее количество элементов.numbers[i]Используйте индексы для доступа к элементам, так же как при использовании массива.
Пример 2: Управление строками
vectorОн может хранить не только числа, но и строки, пользовательские типы и любые другие типы данных.
Пример
#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 <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чтобы завершить цикл ввода чисел).
Другие расширения