学而时习之:C++中的标准模板5

C++ STL 中的 Vector

vector 是标准模板库(STL)中的一种动态数组 ,当元素数量超过当前容量时会自动扩容

程序员无需手动管理容量或提前分配额外空间。但在某些插入/删除操作时,由于内部会按预设阈值重新分配内存,时间开销可能略高。若这些操作对时间极其敏感,建议改用普通数组。

vector 支持边界检查:可用 v.at(i) 访问向量 v 中索引为 i 的元素。

vector 的声明与初始化

vector 在头文件 <vector> 中以类模板 std::vector 的形式定义。

cpp 复制代码
vector<T> v;

其中 T 表示元素的数据类型,v 是给该 vector 起的名字。

vector 常用操作

C++ 中的 vector 提供了多种实用操作,可动态地添加、删除、访问和修改元素(增删改查)。

1.插入元素

  • push_back(value):在 vector 末尾 插入元素,效率很高。平均时间复杂度为 O(1),速度非常快。

  • insert(position, value):在任意位置 (开头、中间、末尾)插入元素。由于需要移动后续元素,时间复杂度为 O(n)

示例代码

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

int main() {
    vector<char> v = {'a', 'f', 'd'};

    // 在末尾插入 'z'
    v.push_back('z');

    // 在索引 1 处插入 'c'
    v.insert(v.begin() + 1, 'c');

    for (int i = 0; i < v.size(); i++){
        cout << v[i] << " ";
    }
    return 0;
}
css 复制代码
a c f d z

2.访问元素

可以用 v[i] 直接访问,或用 v.at(i) 做带边界检查的访问。两者都返回索引 i 处的元素,但如果 i 越界,at(i) 会抛出异常。 操作平均耗时 O(1),速度极快。

示例代码

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

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

    // 使用 operator[] 访问
    cout << "用 [] 访问索引 2 的元素: " << v[2] << endl;

    // 使用 at() 访问
    cout << "用 at() 访问索引 3 的元素: " << v.at(3) << endl;

    // 取消下一行注释将抛出 out_of_range 异常
    // cout << v.at(10) << endl;
    return 0;
}
css 复制代码
用 [] 访问索引 2 的元素: 30
用 at() 访问索引 3 的元素: 40

3.更新元素

只需通过索引使用赋值运算符即可更新元素,例如 v[i] = newValue;

这会把索引 i 处的旧元素替换成新值。

示例代码

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

int main()
{
    vector<int> v = {10, 20, 30};
    cout << "索引 1 的原值: " << v[1] << endl;

    // 更新索引 1 的元素
    v[1] = 50;

    cout << "索引 1 的新值: " << v[1] << endl;
    return 0;
}
复制代码
索引 1 的原值: 20
索引 1 的新值: 50

4.获取 vector 长度

使用 size() 函数即可得到 vector 当前存储的元素个数,例如 v.size()

示例代码

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

int main() {
    vector<char> v = {'a', 'c', 'f', 'd', 'z'};

    // 获取元素个数
    cout << v.size();

    return 0;
}
复制代码
5

5.遍历 vector

遍历 vector 就是逐个访问每个元素,通常用循环实现。 可用下标 for 循环 (v[i])、范围 for 循环 (for (int x : v)) 或迭代器。 时间复杂度为 O(n)

示例代码

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

int main() {
    vector<char> v = {'a', 'c', 'f', 'd', 'z'};

    // 用下标 for 循环遍历
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
    return 0;
}
css 复制代码
a c f d z

6.删除元素

可用 erase() 删除 vector 中的元素,它需要一个指向该元素的迭代器。

由于后续元素都要前移,时间复杂度为 O(n) 。 若只需删除末尾元素 ,用 pop_back() 即可,平均 O(1),速度极快。

示例代码

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

int main() {
    vector<char> v = {'a', 'c', 'f', 'd', 'z'};

    // 删除末尾元素 'z'
    v.pop_back();

    // 删除元素 'f'
    v.erase(find(v.begin(), v.end(), 'f'));

    for (int i = 0; i < v.size(); i++) {
        cout << v[i] << " ";
    }
    return 0;
}
css 复制代码
a c d

7.判断 vector 是否为空

使用 empty() 函数即可检查 vector 是否含有元素。

若为空返回 true,否则返回 false

在访问或修改 vector 前先进行此检查,可避免错误。

示例代码

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

int main() {

    vector<int> v;

    // 检查 vector 是否为空
    if (v.empty()) {
        cout << "Vector 为空。" << endl;
    }

    // 添加一个元素
    v.push_back(100);
    if (!v.empty()) {
        cout << "Vector 非空。首元素为 " << v[0] << endl;
    }
    return 0;
}
复制代码
Vector 为空。
Vector 非空。首元素为 100

多维 vector

多维 vector 是可在多个维度存储数据的动态数组,类似表格或网格。

通过"vector 里再放 vector"实现,可灵活构造行-列(二维)甚至更高维结构。

二维 vector 声明

cpp 复制代码
vector<vector<int>> matrix;

二维 vector 初始化

cpp 复制代码
// 直接赋初值
vector<vector<int>> matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

// 3 行 4 列,全部初始化为 0
vector<vector<int>> matrix(3, vector<int>(4, 0));

访问二维 vector 元素

使用双下标即可:

cpp 复制代码
// 输出 6
cout << matrix[1][2];

遍历二维 vector

示例代码

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

int main() {

    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    cout << "用下标循环遍历二维 vector:\n";

    // 用双重下标 for 循环遍历
    for (int i = 0; i < matrix.size(); i++) {
        for (int j = 0; j < matrix[i].size(); j++) {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}
arduino 复制代码
用下标循环遍历二维 vector:
1 2 3 
4 5 6 
7 8 9 
相关推荐
linx2951 分钟前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克6054 分钟前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
一只旭宝10 分钟前
Python 与 C/C++ 内存模型对比总结
c语言·c++·python
心态还需努力呀27 分钟前
把 Flameshot 编译进鸿蒙 PC:一次 Qt C++ 截图工具的源码级移植实战
c++·qt·harmonyos
科学实验家1 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
学习智者1 小时前
《玄》IDE v3.6.3重磅发布:全功能修复与性能飞跃
开发语言·c++·ide·算法·中文语言 玄
2402_882893861 小时前
C++异常:从概念到实践的一篇博客
c++·异常
m0_734571762 小时前
深入理解C++ 析构函数<二>析构顺序
开发语言·c++
小孩玩什么2 小时前
深入理解字符串匹配算法:BF算法,KMP算法
java·c语言·开发语言·数据结构·c++·算法
无忧.芙桃2 小时前
C++内存管理
c语言·开发语言·c++·青少年编程