01 — std::vector 基础篇

💻 上手代码

最基本的用法

#include <vector>
#include <iostream>

int main() {
    std::vector<int> v;          // 空 vector,size=0, capacity=0

    v.push_back(10);             // 尾部追加 10
    v.push_back(20);             // 尾部追加 20
    v.push_back(30);             // 尾部追加 30

    std::cout << "size: " << v.size() << '\n';           // 3
    std::cout << "capacity: " << v.capacity() << '\n';   // 可能是 4

    // 用下标访问(和数组一模一样)
    std::cout << v[0] << ' ' << v[1] << ' ' << v[2] << '\n'; // 10 20 30

    // 范围 for 遍历
    for (int x : v)
        std::cout << x << ' ';
    std::cout << '\n';

    // 修改元素
    v[1] = 99;
    return 0;
}

几种初始化方式

std::vector<int> a;                   // 空的
std::vector<int> b(5);                // 5 个元素,都是 0
std::vector<int> c(5, 42);            // 5 个元素,都是 42
std::vector<int> d = {1, 2, 3, 4};    // 初始化列表
std::vector<int> e(d);                // 拷贝构造

增删改查速览

std::vector<int> v = {10, 20, 30};

v.push_back(40);       // 尾部追加       [10,20,30,40]
v.pop_back();          // 尾部删除       [10,20,30]
v.front();             // 返回第一个     10
v.back();              // 返回最后一个   30
v.empty();             // 是否为空?     false
v.clear();             // 清空所有元素    []

💡 关于下标访问v[i] 不检查越界——越界是未定义行为v.at(i) 越界时抛出 std::out_of_range 异常,更安全但略慢一丝。

尾部追加:push_back vs emplace_back

#include <string>

std::vector<std::string> words;

words.push_back("hello");              // 从 const char* 构造临时 string,再移入 vector
words.emplace_back(5, 'A');            // 直接传"5个 A"给 string 构造函数,省一次临时对象

经验法则:往 vector 里放元素时,如果参数能直接匹配元素类型的构造函数,优先用 emplace_back


✍️ 练手题

题 1:反转打印

从控制台读取 N 个整数,用 vector 存,然后从后往前打印。

💡 提示:push_back 读入;反向遍历注意 v.size() 返回 size_t(无符号),建议用 for (size_t i = v.size(); i > 0; --i) 配合 v[i-1]

题 2:去掉尾部零

给定 vector<int>,把末尾所有的 0 删掉。比如 {1,2,0,3,0,0}{1,2,0,3}

💡 提示:用 while (!v.empty() && v.back() == 0) v.pop_back();

题 3:观察 capacity 变化

写一个循环,连续 push_back 100 个整数,每次检查 capacity() 是否变了,打印扩容时刻的 size 和 capacity。

你会发现什么规律?

💡 提示:记录上一次的 capacity(),每次 push_back 后比较是否变化,扩容时刻打印 size()capacity()


❓ 自测 3 问

Q1v[3]v.at(3) 的区别是什么?

Q2std::vector<int> v(5) 之后,v.size()v.capacity() 各是多少?v[0] 的值是什么?

Q3:为什么 v.front()v[0] 能用 O(1) 拿到第一个元素?


📋 速查卡

项目 内容
本质 连续内存的动态数组
强项 尾部增删 O(1),随机访问 O(1),CPU 缓存友好
弱项 中间插入/删除 O(n),扩容时有拷贝开销
头文件 #include <vector>
关键 API push_back / emplace_back / pop_back / front / back / size / capacity / clear / empty / operator[]
常见坑 不要在有扩容风险的循环里持有元素的指针或引用
下一课 迭代器基础
posted @ 2026-05-09 23:13  thammer  阅读(22)  评论(0)    收藏  举报