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

相关推荐
虾球xz几秒前
游戏引擎学习第302天:使用精灵边界进行排序
c++·学习·算法·游戏引擎
虾球xz5 分钟前
游戏引擎学习第297天:将实体分离到Z层中
c++·人工智能·学习·游戏引擎
yxc_inspire5 分钟前
基于Qt的app开发第十天
开发语言·c++·qt·app
只因从未离去10 分钟前
黑马Java基础笔记-13常用查找算法
java·开发语言·笔记
学习编程的gas33 分钟前
C++类与对象(二):六个默认构造函数(二)
开发语言·c++
diygwcom34 分钟前
turn.js与 PHP 结合使用来实现 PDF 文件的页面切换效果
开发语言·pdf·php
XiaoyaoCarter36 分钟前
每日leetcode
数据结构·c++·算法·leetcode·职场和发展·kmp算法
CodeWithMe39 分钟前
【C/C++】Observer与Producer-Consumer模式解析
c语言·开发语言·c++
WiKiLeaks_successor41 分钟前
error: expected primary-expression before ‘.‘ token << Book.displayMessage()
c++
ThetaarSofVenice1 小时前
Java虚拟机 -虚拟机栈
java·开发语言·jvm