C++ STL 中的 vector 总结

1. 什么是 std::vector

std::vector 是 C++ STL 提供的动态数组容器,可以动态调整大小并存储任意类型的元素。

与普通数组相比,std::vector 更加灵活,提供了丰富的操作接口。


2. 基本特性

  • 动态大小:支持在运行时动态增加或减少大小,自动管理内存。
  • 连续存储:元素在内存中是连续存储的,支持随机访问。
  • 时间复杂度
    • 随机访问:( O(1) )。
    • 插入/删除
      • 尾部操作:( O(1) )。
      • 中间或前部操作:( O(n) )(需要移动元素)。
  • 自动内存管理:动态分配和释放内存,不需要手动操作。
  • 迭代器支持:支持 STL 风格的迭代器,方便遍历和操作。

3. 常用函数

3.1 元素访问

函数 功能说明
at(index) 返回指定索引的元素,带边界检查。
operator[index] 返回指定索引的元素,不进行边界检查。
front() 返回第一个元素。
back() 返回最后一个元素。
data() 返回指向底层数组的指针。

3.2 容量操作

函数 功能说明
size() 返回当前元素数量。
capacity() 返回当前分配的存储容量。
empty() 判断是否为空。
resize(n, val) 调整大小为 n,多余部分用 val 填充,默认值为 0
reserve(n) 增加存储容量至至少 n(不会改变元素数量)。
shrink_to_fit() 释放未使用的内存,调整容量以适应当前大小。

3.3 修改操作

函数 功能说明
push_back(val) 在尾部添加一个元素。
pop_back() 移除尾部元素。
insert(pos, val) 在迭代器 pos 指定位置插入元素 val
erase(pos) 删除迭代器 pos 指向的元素。
clear() 清空所有元素。
assign(n, val) 将容器填充为 nval
emplace_back(args) 在尾部直接构造元素(避免拷贝,提高性能)。

4. 示例代码

4.1 基本使用

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> nums;

    // 添加元素
    nums.push_back(10);
    nums.push_back(20);
    nums.push_back(30);

    // 遍历元素
    for (int i = 0; i < nums.size(); i++) {
        cout << nums[i] << " ";
    }
    cout << endl;

    // 删除尾部元素
    nums.pop_back();

    // 使用迭代器遍历
    for (auto it = nums.begin(); it != nums.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

输出:

plaintext 复制代码
10 20 30
10 20

4.2 动态调整大小

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> nums(5, 1);  // 初始化大小为 5,每个元素值为 1

    cout << "Initial size: " << nums.size() << endl;

    nums.resize(8, 2);  // 调整大小为 8,新增元素值为 2
    for (auto num : nums) {
        cout << num << " ";
    }
    cout << endl;

    nums.shrink_to_fit();  // 调整容量以匹配大小
    cout << "Size after shrinking: " << nums.size() << endl;

    return 0;
}

输出:

plaintext 复制代码
Initial size: 5
1 1 1 1 1 2 2 2
Size after shrinking: 8

4.3 插入和删除元素

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

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

    // 插入元素
    nums.insert(nums.begin() + 2, 25);  // 在第三个位置插入 25

    // 删除元素
    nums.erase(nums.begin());  // 删除第一个元素

    for (auto num : nums) {
        cout << num << " ";
    }

    return 0;
}

输出:

plaintext 复制代码
20 25 30 40

5. 注意事项

  1. 随机访问性能优越 :由于 std::vector 的底层是动态数组,支持通过索引直接访问元素,性能为 ( O(1) )。
  2. 插入和删除:在尾部操作效率高,复杂度为 ( O(1) );在中间或前部操作可能需要移动大量元素,复杂度为 ( O(n) )。
  3. 容量管理
    • 容量 capacity 通常大于或等于当前大小 size
    • 使用 reserve() 可以预先分配内存,减少动态扩展的次数。
  4. 迭代器失效
    • 动态扩展或删除元素时,可能会导致迭代器失效。
  5. 内存使用shrink_to_fit() 可释放未使用的内存。

6. 应用场景

6.1 动态数组

当数组大小在运行时需要动态变化时,使用 std::vector 更加合适。

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;

    vector<int> nums;
    for (int i = 0; i < n; i++) {
        nums.push_back(i);
    }

    for (auto num : nums) {
        cout << num << " ";
    }
    return 0;
}

6.2 多维数组

通过嵌套 std::vector 创建动态二维数组。

cpp 复制代码
#include <vector>
#include <iostream>
using namespace std;

int main() {
    int rows = 3, cols = 4;
    vector<vector<int>> matrix(rows, vector<int>(cols, 0));

    // 修改元素
    matrix[1][2] = 5;

    // 输出矩阵
    for (auto& row : matrix) {
        for (auto& elem : row) {
            cout << elem << " ";
        }
        cout << endl;
    }
    return 0;
}

输出:

plaintext 复制代码
0 0 0 0 
0 0 5 0 
0 0 0 0

7. 总结表

特性 说明
动态大小 支持动态增删元素,内存由容器管理。
连续存储 元素在内存中是连续存储,适合随机访问。
操作效率 随机访问为 ( O(1) ),尾部插入/删除为 ( O(1) )。
插入/删除限制 中间或前部插入/删除效率低,可能导致大量元素移动。
多维支持 可以嵌套 std::vector,实现动态二维/三维数组。
迭代器支持 支持 STL 风格迭代器,方便遍历和操作。

相关推荐
奈斯先生Vector3 分钟前
本地图片识别怎么接入多模态 AI?用 Python API 理解 GPT-4o Vision 的真实工作流
开发语言·人工智能·windows·python·网络协议·http·aigc
OPEN-F7 分钟前
C++17新特性精讲:结构化绑定、if constexpr与实用类型
开发语言·c++
OPEN-F10 分钟前
C++并发编程:线程与互斥锁
开发语言·c++
俊昭喜喜里12 分钟前
C#中的decimal
开发语言·c#
码匠许师傅13 分钟前
【设计模式精讲】11.桥接模式(Bridge)
c++·设计模式·桥接模式·uml
小小、码农21 分钟前
【网络】套接字(Socket)编程——TCP版
linux·服务器·网络·c++·网络协议·tcp/ip
catchadmin22 分钟前
免费可商用 PHP 管理后台 CatchAdmin V5.4.0 发布,新增短信服务能力
开发语言·php
天空之城--30 分钟前
C++ ODR-use 深度解析:从原理到实战
c++
小白学大数据33 分钟前
API 调用错误处理实战:分层定位、有纪律地重试与可观测性设计
开发语言·网络·人工智能
旖旎夜光1 小时前
LeetCode 974:和可被 K 整除的子数组(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和