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

相关推荐
软件黑马王子3 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
闲猫3 小时前
go orm GORM
开发语言·后端·golang
黑不溜秋的5 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
李白同学5 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?6 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农6 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿6 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!7 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
柠石榴7 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
王老师青少年编程7 小时前
【GESP C++八级考试考点详细解读】
数据结构·c++·算法·gesp·csp·信奥赛