vector 是 C++ STL 里最常用的动态数组,核心优势是支持随机访问(按索引取值快)、自动扩容,是日常开发中替代普通数组的首选,以下是它的核心用法:

一、基础操作:定义与初始化

这是使用 vector 的第一步,新手要掌握 3 种最常用的初始化方式:

cpp

运行

#include <iostream>
#include <vector> // 必须包含的头文件
using namespace std;

int main() {
    // 1. 空vector(最常用)
    vector<int> vec1; 

    // 2. 初始化时指定大小+默认值(值为0)
    vector<int> vec2(5); // 5个元素,每个都是0

    // 3. 初始化时指定大小+自定义初始值
    vector<int> vec3(5, 10); // 5个元素,每个都是10

    // 4. 用已有数组/列表初始化(C++11+)
    vector<int> vec4 = {1, 2, 3, 4, 5}; 

    return 0;
}

二、核心操作:增删改查(高频)

这是 vector 最核心的使用场景,记住这些就能满足 80% 的需求:

cpp

运行

int main() {
    vector<int> vec = {10, 20, 30};

    // 1. 新增元素(尾部添加,效率最高)
    vec.push_back(40); // vec变为:10,20,30,40

    // 2. 删除元素(尾部删除,效率最高)
    vec.pop_back(); // vec变回:10,20,30

    // 3. 修改元素(随机访问,和数组一样)
    vec[1] = 200; // vec变为:10,200,30
    // 更安全的修改(会检查索引是否越界)
    vec.at(1) = 20; // 改回20,越界会抛异常

    // 4. 查找/访问元素
    cout << "第一个元素:" << vec.front() << endl; // 10
    cout << "最后一个元素:" << vec.back() << endl; // 30
    cout << "索引2的元素:" << vec[2] << endl; // 30

    // 5. 获取大小
    cout << "元素个数:" << vec.size() << endl; // 3
    cout << "当前容量(可容纳的元素数):" << vec.capacity() << endl;

    return 0;
}

三、进阶操作:遍历与扩容优化

1. 3 种遍历方式(新手优先掌握前两种)

cpp

运行

int main() {
    vector<int> vec = {1, 2, 3, 4, 5};

    // 方式1:下标遍历(最直观)
    for (int i = 0; i < vec.size(); i++) {
        cout << vec[i] << " ";
    }
    cout << endl;

    // 方式2:范围for遍历(C++11+,简洁)
    for (int num : vec) {
        cout << num << " ";
    }
    cout << endl;

    // 方式3:迭代器遍历(适合复杂操作)
    for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}
2. 扩容优化(提升性能)

vector 自动扩容时会重新分配内存、拷贝元素,频繁扩容会降低性能,可提前预留空间:

cpp

运行

int main() {
    vector<int> vec;
    vec.reserve(100); // 提前预留100个元素的空间
    // 后续添加100个元素都不会触发扩容,性能更高

    // 清空元素(保留容量,不释放内存)
    vec.clear(); 
    cout << "清空后大小:" << vec.size() << endl; // 0
    cout << "清空后容量:" << vec.capacity() << endl; // 100

    // 释放多余容量(缩容)
    vector<int>().swap(vec); 
    cout << "缩容后容量:" << vec.capacity() << endl; // 0

    return 0;
}

四、新手避坑要点

  1. 索引越界:直接用vec[i]越界会崩溃,用vec.at(i)会抛异常,调试时优先用at()
  2. push_back 效率:尾部增删是 O (1)(均摊),中间插入 / 删除是 O (n),如果需要频繁在中间操作,优先用 list;
  3. 容量≠大小size()是实际元素数,capacity()是已分配的内存能容纳的元素数,扩容会让 capacity 翻倍;
  4. 空 vector 访问:空 vector 调用front()/back()会崩溃,先判断!vec.empty()再访问。

总结

  1. vector 核心是动态数组,优先用push_back()/pop_back()增删,用下标 /at()访问;
  2. 遍历优先选下标或范围 for,复杂场景用迭代器;
  3. 频繁添加元素时用reserve()预留空间,避免频繁扩容损耗性能;
  4. 避免索引越界,空 vector 先判空再访问首尾元素。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐