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 风格迭代器,方便遍历和操作。

相关推荐
陳10305 分钟前
C++:红黑树
开发语言·c++
一切尽在,你来10 分钟前
C++ 零基础教程 - 第 6 讲 常用运算符教程
开发语言·c++
泉-java12 分钟前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
weixin_4997715531 分钟前
C++中的组合模式
开发语言·c++·算法
初级代码游戏32 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
_waylau36 分钟前
鸿蒙架构师修炼之道-架构师的职责是什么?
开发语言·华为·harmonyos·鸿蒙
2的n次方_1 小时前
CANN Ascend C 编程语言深度解析:异构并行架构、显式存储层级与指令级精细化控制机制
c语言·开发语言·架构
近津薪荼1 小时前
dfs专题5——(二叉搜索树中第 K 小的元素)
c++·学习·算法·深度优先
xiaoye-duck1 小时前
吃透 C++ STL list:从基础使用到特性对比,解锁链表容器高效用法
c++·算法·stl
_F_y1 小时前
C++重点知识总结
java·jvm·c++