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>
之前,需要包含以下头文件:
#include <vector>
#include <cstdint> // 提供 uint8_t 定义
std::vector
可以根据需要自动调整其容量。at()
方法)以及异常安全保证。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) 初始化向量。 |
示例:
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()); // 从范围初始化
函数 | 描述 |
---|---|
size() |
返回当前向量中元素的数量。 |
capacity() |
返回当前分配的存储容量(单位为元素个数)。 |
empty() |
检查向量是否为空。 |
reserve(size_t new_cap) |
预留至少 new_cap 个元素的空间。 |
shrink_to_fit() |
尝试减少容量以匹配实际使用的大小(非强制)。 |
示例:
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
函数 | 描述 |
---|---|
operator[] |
通过索引访问元素(不检查范围)。 |
at(size_t pos) |
通过索引访问元素(范围检查)。 |
front() |
返回第一个元素。 |
back() |
返回最后一个元素。 |
data() |
返回指向底层数组的指针(C 风格数组)。 |
示例:
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(); // 获取底层数组指针
函数 | 描述 |
---|---|
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 填充。 |
示例:
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(); // 清空向量
std::vector
支持标准的迭代器操作,包括前向迭代器和反向迭代器。
函数 | 描述 |
---|---|
begin() |
返回指向第一个元素的迭代器。 |
end() |
返回指向最后一个元素之后的迭代器。 |
rbegin() |
返回指向最后一个元素的反向迭代器。 |
rend() |
返回指向第一个元素之前的反向迭代器。 |
示例:
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
}
reserve()
。std::vector
在随机访问和缓存友好性方面表现优异。std::vector
实现了高效的拷贝控制机制(如移动语义),但频繁的拷贝仍可能导致性能问题。以下是一个完整的示例,展示了 std::vector<uint8_t>
的基本用法:
#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++ 官方文档。
如果您有任何疑问或需要进一步的帮助,请随时联系我们!