跳转至

vector

vector

🧠 概述

vector 是 C++ STL 中的 动态数组容器,底层是 内存连续 的存储结构。

其核心特点是:

  • ✅ 支持随机访问(可通过 [].at() 访问元素);
  • 🚀 自动扩容(插入元素时,空间不足会自动扩展);
  • ⚡ 尾部插入与删除效率高($O(1)$ 均摊复杂度);
  • ⚠️ 插入/删除中间或开头元素效率较低($O(n)$)。

定义方式:

vector<value_type> v;

📦 示例:

vector<int> v1;                     // 整型 vector
vector<string> v2;                  // 字符串 vector
vector<vector<int>> v3;            // 二维 vector
vector<pair<int, int>> v4;         // 存储 pair 的 vector

📦 初始化方法:

vector<int> v = {1, 2, 3}; // 手动赋值
vector<int> v(n + 1); // 初始化长度为 n + 1 的 vector,元素全部为 0
vector<int> v(n, 1); // 初始化长度为 n 的 vector,元素全部为 1

🔧 基础操作

以下操作以 vector<int> v 为例:

功能 示例代码 描述 时间复杂度
尾部插入 v.push_back(x); 添加元素到末尾 $O(1)$ 均摊
尾部删除 v.pop_back(); 删除最后一个元素 $O(1)$
获取元素个数 v.size(); 返回当前元素数量 $O(1)$
判断是否为空 v.empty(); 返回是否为空 $O(1)$
清空元素 v.clear(); 清空所有元素 $O(n)$
随机访问 v[i]; / v.at(i); 获取第 i 个元素(0-based) $O(1)$
获取首/尾元素 v.front(); / v.back(); 获取第一个/最后一个元素 $O(1)$
替换内容 v.assign(n, val); 设置为 n 个 val 元素 $O(n)$
交换内容 v.swap(v2); 与另一个 vector 交换 $O(1)$
判断相等 v == v2 判断两个 vector 是否相等 $O(n)$

🔁 遍历方式

🧭 方法一:下标访问

for (int i = 0; i < v.size(); i++) 
{
    cout << v[i] << " ";
}

🌀 方法二:范围 for 循环

for (auto x : v) 
{
    cout << x << " ";
}

🧲 方法三:迭代器遍历

for (auto it = v.begin(); it != v.end(); it++) 
{
    cout << *it << " ";
}

✨ 常用算法函数

sort(v.begin(), v.end());                     // 升序排序
sort(v.begin(), v.end(), greater<>());       // 降序排序
reverse(v.begin(), v.end());                 // 翻转 vector

int pos = lower_bound(v.begin(), v.end(), x) - v.begin(); // 第一个 >= x 的位置
int pos = upper_bound(v.begin(), v.end(), x) - v.begin(); // 第一个 > x 的位置

🧩 二维 vector 用法

✅ 方法一:数组嵌套 vector(行数固定)

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5; 
vector<int> a[N];

int main() 
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) 
    {
        int m;
        cin >> m;
        for (int j = 0; j < m; j++) 
        {
            int x;
            cin >> x;
            a[i].push_back(x);
        }
    }
    return 0;
}

✅ 方法二:vector 嵌套 vector(行数可变)

#include <bits/stdc++.h>
using namespace std;

int main() 
{
    int n;
    cin >> n;
    vector<vector<int>> a(n + 1);
    for (int i = 1; i <= n; i++) 
    {
        int m;
        cin >> m;
        for (int j = 0; j < m; j++) 
        {
            int x;
            cin >> x;
            a[i].push_back(x);
        }
    }
    return 0;
}

✅ 方法三:初始化二维矩阵

int n, m;
cin >> n >> m;
vector<vector<int>> a(n, vector<int>(m, 0));

for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++)
        cin >> a[i][j];

// 或使用 1-based 编号:
vector<vector<int>> b(n + 1, vector<int>(m + 1, 0));
for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++)
        cin >> b[i][j];

🆚 emplace_back vs push_back

v.push_back(MyClass(x, y));       // 先构造临时对象再复制进 vector
v.emplace_back(x, y);             // 直接在 vector 内构造,更高效

✅ 更推荐 emplace_back,特别是用于结构体、类对象插入。


📌 总结对比

特性 vector
支持随机访问
尾部插入/删除效率高
中间插入/删除效率低 ⚠️
自动扩容
内存连续
与数组互通

🧩 适用场景

  • 需要快速访问元素(支持 []);
  • 常从尾部插入或删除;
  • 对内存连续性有要求(如配合 sort() 使用)。