C++ <vector> push_back 函数
在众多容器中,vector (向量) 是最常用、最像能自动变长的数组的一个,而 push_back 就是让这个数组变长的关键函数。
push_back 是一个成员函数,用于在动态数组 (vector) 或其他序列容器(如 list, deque) 的末尾添加一个新元素。
push_back实现了容器的动态增长,你不需要预先指定容器最终的大小,可以根据程序运行时的需要,随时随地添加元素。
单词释义: push 是推入,back 是后面,合起来就是推入到后面,非常形象。
基本语法与参数
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. 创建一个空的 vector,用于存放整数
std::vector<int> numbers;
std::cout << "初始时,vector的大小是: " << numbers.size() << std::endl;
// 3. 使用 push_back 添加元素
numbers.push_back(10); // 在末尾添加整数 10
numbers.push_back(20); // 在 10 后面添加 20
numbers.push_back(30); // 在 20 后面添加 30
std::cout << "添加后,vector的大小是: " << numbers.size() << std::endl;
// 4. 遍历并输出所有元素,验证添加顺序
std::cout << "vector中的元素是: ";
for(int i = 0; i < numbers.size(); ++i) {
std::cout << numbers[i] << " "; // 像数组一样通过下标访问
}
std::cout << std::endl;
return 0;
}
#include <vector> // 1. 必须包含 vector 头文件
int main() {
// 2. 创建一个空的 vector,用于存放整数
std::vector<int> numbers;
std::cout << "初始时,vector的大小是: " << numbers.size() << std::endl;
// 3. 使用 push_back 添加元素
numbers.push_back(10); // 在末尾添加整数 10
numbers.push_back(20); // 在 10 后面添加 20
numbers.push_back(30); // 在 20 后面添加 30
std::cout << "添加后,vector的大小是: " << numbers.size() << std::endl;
// 4. 遍历并输出所有元素,验证添加顺序
std::cout << "vector中的元素是: ";
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 <iostream>
#include <vector>
#include <string> // 使用 string 也需要包含头文件
int main() {
// 创建一个存储 std::string 的 vector
std::vector<std::string> tasks;
// 使用 push_back 添加待办事项
tasks.push_back("学习 C++ push_back");
tasks.push_back("写作业");
tasks.push_back("阅读技术文档");
std::cout << "今日待办事项 (" << tasks.size() << " 项):\n";
// 使用范围 for 循环 (C++11) 遍历,更简洁
for(const auto& task : tasks) {
std::cout << "- " << task << std::endl;
}
return 0;
}
#include <vector>
#include <string> // 使用 string 也需要包含头文件
int main() {
// 创建一个存储 std::string 的 vector
std::vector<std::string> tasks;
// 使用 push_back 添加待办事项
tasks.push_back("学习 C++ push_back");
tasks.push_back("写作业");
tasks.push_back("阅读技术文档");
std::cout << "今日待办事项 (" << tasks.size() << " 项):\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::string的容器。push_back的参数现在是字符串字面量(会自动转换为std::string)。for(const auto& task : tasks)是 C++11 引入的"基于范围的 for 循环",它会自动遍历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;
}
#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>