菜单

(标准) vector相关

下载

C++ 中的 std::vector<uint8_t> 详细说明

概述

std::vector 是 C++ 标准库中的动态数组容器,位于 <vector> 头文件中。它提供了动态扩展和收缩的能力,同时支持随机访问。std::vector<uint8_t>std::vector 的特化形式,其中元素类型为 uint8_t(通常定义为 unsigned char),适用于存储字节数据或小型整数序列。

注意: 在实际开发中,uint8_t 通常通过 <cstdint> 头文件引入,确保跨平台兼容性。


包含头文件

在使用 std::vector<uint8_t> 之前,需要包含以下头文件:

cpp 复制代码
#include <vector>
#include <cstdint> // 提供 uint8_t 定义

基本特性

  1. 动态大小std::vector 可以根据需要自动调整其容量。
  2. 连续存储:所有元素在内存中是连续存储的,因此支持高效的随机访问。
  3. 安全性:提供边界检查(通过 at() 方法)以及异常安全保证。
  4. 灵活性:支持多种构造方式、迭代器操作和算法适配。

构造方式

std::vector<uint8_t> 提供了多种构造方法:

构造方法 描述
std::vector<uint8_t>() 创建一个空向量。
std::vector<uint8_t>(size_t n) 创建一个包含 n 个默认初始化为 0 的元素的向量。
std::vector<uint8_t>(size_t n, uint8_t value) 创建一个包含 n 个值为 value 的元素的向量。
std::vector<uint8_t>(const std::vector<uint8_t>& other) 拷贝构造函数。
std::vector<uint8_t>(std::vector<uint8_t>&& other) 移动构造函数。
std::vector<uint8_t>(const_iterator first, const_iterator last) 使用范围 [first, last) 初始化向量。

示例:

cpp 复制代码
std::vector<uint8_t> v1;                      // 空向量
std::vector<uint8_t> v2(5);                   // 5 个默认值为 0 的元素
std::vector<uint8_t> v3(5, 255);              // 5 个值为 255 的元素
std::vector<uint8_t> v4 = {1, 2, 3, 4};       // 列表初始化
std::vector<uint8_t> v5(v3.begin(), v3.end()); // 从范围初始化

成员函数

1. 容量与大小

函数 描述
size() 返回当前向量中元素的数量。
capacity() 返回当前分配的存储容量(单位为元素个数)。
empty() 检查向量是否为空。
reserve(size_t new_cap) 预留至少 new_cap 个元素的空间。
shrink_to_fit() 尝试减少容量以匹配实际使用的大小(非强制)。

示例:

cpp 复制代码
std::vector<uint8_t> v = {1, 2, 3};
std::cout << "Size: " << v.size() << std::endl;        // 输出 3
std::cout << "Capacity: " << v.capacity() << std::endl; // 输出 >=3
v.reserve(10);
std::cout << "New Capacity: " << v.capacity() << std::endl; // 输出 >=10

2. 元素访问

函数 描述
operator[] 通过索引访问元素(不检查范围)。
at(size_t pos) 通过索引访问元素(范围检查)。
front() 返回第一个元素。
back() 返回最后一个元素。
data() 返回指向底层数组的指针(C 风格数组)。

示例:

cpp 复制代码
std::vector<uint8_t> v = {1, 2, 3};
std::cout << v[1] << std::endl;           // 输出 2
std::cout << v.at(1) << std::endl;        // 输出 2
std::cout << v.front() << std::endl;      // 输出 1
std::cout << v.back() << std::endl;       // 输出 3
uint8_t* ptr = v.data();                  // 获取底层数组指针

3. 修改向量

函数 描述
push_back(uint8_t value) 在向量末尾添加一个元素。
pop_back() 删除向量末尾的元素。
insert(iterator pos, uint8_t value) 在指定位置插入一个元素。
erase(iterator pos) 删除指定位置的元素。
clear() 清空向量中的所有元素。
resize(size_t new_size, uint8_t value = 0) 调整向量大小,不足部分用 value 填充。

示例:

cpp 复制代码
std::vector<uint8_t> v = {1, 2, 3};
v.push_back(4);                           // 添加元素 4
v.insert(v.begin() + 1, 99);              // 在索引 1 处插入 99
v.erase(v.begin() + 2);                   // 删除索引 2 的元素
v.pop_back();                             // 删除最后一个元素
v.clear();                                // 清空向量

4. 迭代器

std::vector 支持标准的迭代器操作,包括前向迭代器和反向迭代器。

函数 描述
begin() 返回指向第一个元素的迭代器。
end() 返回指向最后一个元素之后的迭代器。
rbegin() 返回指向最后一个元素的反向迭代器。
rend() 返回指向第一个元素之前的反向迭代器。

示例:

cpp 复制代码
std::vector<uint8_t> v = {1, 2, 3};
for (auto it = v.begin(); it != v.end(); ++it) {
    std::cout << *it << " ";              // 输出 1 2 3
}
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {
    std::cout << *rit << " ";             // 输出 3 2 1
}

性能注意事项

  1. 动态扩展成本:当向量容量不足时,会重新分配更大的内存块并将旧数据复制到新位置,这可能导致性能开销。建议在知道大致大小时提前调用 reserve()
  2. 连续存储优势:由于元素是连续存储的,std::vector 在随机访问和缓存友好性方面表现优异。
  3. 拷贝控制std::vector 实现了高效的拷贝控制机制(如移动语义),但频繁的拷贝仍可能导致性能问题。

示例代码

以下是一个完整的示例,展示了 std::vector<uint8_t> 的基本用法:

cpp 复制代码
#include <iostream>
#include <vector>
#include <cstdint>

int fun() {
    std::vector<uint8_t> v = {1, 2, 3, 4};

    // 打印初始向量
    std::cout << "Initial vector: ";
    for (auto val : v) {
        std::cout << static_cast<int>(val) << " "; // 输出为 int 类型
    }
    std::cout << std::endl;

    // 添加元素
    v.push_back(5);
    std::cout << "After push_back(5): ";
    for (auto val : v) {
        std::cout << static_cast<int>(val) << " ";
    }
    std::cout << std::endl;

    // 插入元素
    v.insert(v.begin() + 2, 99);
    std::cout << "After insert(99): ";
    for (auto val : v) {
        std::cout << static_cast<int>(val) << " ";
    }
    std::cout << std::endl;

    // 删除元素
    v.erase(v.begin() + 3);
    std::cout << "After erase(): ";
    for (auto val : v) {
        std::cout << static_cast<int>(val) << " ";
    }
    std::cout << std::endl;

    return 0;
}

来源

基于 C++ 标准库的相关知识编写。更多详细信息可参考 C++ 官方文档

如果您有任何疑问或需要进一步的帮助,请随时联系我们!

最近修改: 2025-02-18Powered by