现在位置: 首页 > C++ 教程 > 正文

C++ <vector> push_back 函数

C++ 容器类 <vector> C++ 容器类 <vector>


在众多容器中,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;
}

运行结果预期:

初始时,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 的 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;
}

这个例子展示了如何用 push_back 在循环中动态填充容器,并最后计算平均值。你可以尝试运行并输入 100 90 85 a(最后输入一个字母 a 来结束数字输入循环)。


C++ 容器类 <vector> C++ 容器类 <vector>