一、上期回顾

掌握了 C++ STL string 字符串类的构造、赋值、遍历、常用接口、与 C 字符数组互转。今天开始学习 STL 最常用动态数组:vector

二、vector 是什么

vector动态数组

  • 底层还是连续内存,和普通数组一样支持随机访问
  • 自动扩容,不用手动关心大小
  • 封装了增删改查全套接口,比原生数组安全好用

三、vector 相比于普通数组优势

  1. 普通数组:固定长度,容易越界、栈溢出
  2. vector:动态自动扩容,空间灵活
  3. 支持直接赋值、拷贝、整体初始化
  4. 自带大小、容量、清空、插入删除接口
  5. 可以作为函数返回值,不用手动管理内存

四、vector 常用构造方式

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    // 1. 空容器
    vector<int> v1;

    // 2. n个初始化为0
    vector<int> v2(5);

    // 3. n个相同值
    vector<int> v3(5, 10);

    // 4. 拷贝构造
    vector<int> v4(v3);

    // 5. 数组区间构造
    int arr[] = {1,2,3,4};
    vector<int> v5(arr, arr+4);

    return 0;
}

五、vector 常用赋值方式

vector<int> v1 = {1,2,3};
vector<int> v2;

// 1. 直接赋值
v2 = v1;

// 2. assign 赋值
v2.assign(3, 66);

// 3. 区间赋值
v2.assign(v1.begin(), v1.end());

六、vector 遍历三种方式

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

// 1. 下标遍历
for(int i = 0; i < v.size(); i++)
{
    cout << v[i] << " ";
}

// 2. 迭代器遍历
for(vector<int>::iterator it = v.begin(); it != v.end(); ++it)
{
    cout << *it << " ";
}

// 3. C++11 范围for
for(auto val : v)
{
    cout << val << " ";
}

七、vector 核心接口必背

vector<int> v;

// 尾部插入
v.push_back(10);

// 尾部删除
v.pop_back();

// 获取元素个数
v.size();

// 获取容量
v.capacity();

// 判断是否为空
v.empty();

// 清空元素
v.clear();

// 指定位置插入
v.insert(v.begin(), 99);

// 指定位置删除
v.erase(v.begin());

// 预留空间,减少扩容
v.reserve(100);

// 重置大小
v.resize(10);

八、size 与 capacity 区别(面试常问)

  • size:当前实际元素个数
  • capacity:已经分配的内存容量
  • size == capacity 再插入元素,vector 自动扩容

九、vector 扩容机制原理

  1. vector 底层连续内存,满了不能原地扩展
  2. 重新开辟一块更大内存
  3. 把旧元素拷贝到新空间
  4. 释放旧内存
  5. 指向新空间

一般扩容规则:

  • 2 倍 或 1.5 倍 扩容(不同编译器略有差异)
  • 提前用 reserve() 预留空间,可避免多次扩容,提升效率

十、完整综合示例代码

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> v;

    // 尾插元素
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);

    cout << "元素遍历:";
    for(auto val : v)
    {
        cout << val << " ";
    }
    cout << endl;

    cout << "size:" << v.size() << endl;
    cout << "capacity:" << v.capacity() << endl;

    // 头部插入
    v.insert(v.begin(), 99);
    cout << "插入后第一个元素:" << v[0] << endl;

    // 清空
    v.clear();
    cout << "清空后size:" << v.size() << endl;

    return 0;
}

十一、今日核心总结

  1. vector 是动态连续数组,替代原生数组首选
  2. size 实际元素数,capacity 已分配容量
  3. 三种遍历:下标、迭代器、范围 for
  4. 常用操作:push_back、pop_back、insert、erase、clear
  5. 提前 reserve 预留空间,减少自动扩容开销

十二、课后练习

  1. 创建 vector 存入 1~10,遍历打印
  2. 在第 2 个位置插入数值 66
  3. 删除最后一个元素,观察 size 变化

更多推荐