学而时习之: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 
相关推荐
马剑威(威哥爱编程)2 小时前
【鸿蒙开发案例篇】NAPI 实现 ArkTS 与 C++ 间的复杂对象传递
c++·华为·harmonyos
ZouZou老师2 小时前
C++设计模式之抽象工厂模式:以家具生产为例
c++·设计模式·抽象工厂模式
旖旎夜光2 小时前
list实现(7)(下)
c++·list
jwybobo20072 小时前
redis7.x源码分析:(9) 内存淘汰策略
linux·c++·redis
阿拉伯柠檬2 小时前
实现一个异步操作线程池
开发语言·数据结构·c++·面试
2301_803554523 小时前
Qt禁止子线程直接操作GUI
c++
羑悻的小杀马特3 小时前
C++与Redis高效交互:通过optional与迭代器玩转String/List/Set......,打造高性能存储方案!
c++·redis·交互
+++.3 小时前
c++雪花屏(vsCode+cmake+mingw+ninja)
开发语言·c++·vscode
小年糕是糕手3 小时前
【C++】内存管理(下)
java·c语言·开发语言·数据结构·c++·算法