[英]Split a vector into an array of vectors
我想将一个字节向量拆分为一个具有相等字节向量的数组,例如,如果我有
std::vector<uint8_t> vec{11,22,33,44,55,66,77,88};
std::array<std::vector<uint8_t>, N> arr; // N is the number of subvectors from the vector vec
如果 N == 4 arr 的内容将是 4 个向量每个向量包含 2 个元素 { {11,22}, {33,44}, {55,66}, {77,88} }
由于如果N
没有均匀地划分为vec.size()
,则这是一个硬错误,因此这实际上很容易解决。 基本逻辑是:
N
向量vec.size() / N
保留空间(可选)vec
vec.size() / N
(基本上,循环遍历vec.size() / N
来自vec
元素,并存储在结果向量中) 由于结果是std::array
,大小必须静态指定——这意味着用户能够指定这个数字,只能使用N
的template
非类型参数来完成。 例如:
#include <vector> // std::vector
#include <cstdint> // std::uint8_t
#include <cstddef> // std::size_t
#include <stdexcept> // std::runtime_error
#include <cassert> // assert
#include <array> // std::array
template <std::size_t N>
auto split(const std::vector<std::uint8_t>& vec) -> std::array<std::vector<std::uint8_t>, N>
{
// Handle the error case
if (vec.size() % N != 0) {
throw std::runtime_error{"vec.size() is not divisible by N"};
}
const auto values_per_container = vec.size() / N;
auto result = std::array<std::vector<std::uint8_t>, N>{};
auto i = 0u;
// Iterate through the vectors in the array
for (auto& v : result) {
v.reserve(values_per_container);
// Store 'vec.size() / N' objects per container
for (auto j = 0; j < values_per_container; ++j, ++i) {
assert(i < vec.size());
v.push_back(vec[i]);
}
}
return result;
};
在这里使用i
作为索引来迭代输入vec
是安全的,并且应该是这段代码的不变式——因为我们首先确保vec.size() / N
是有效的。 因此在这里使用assert
这是编译器资源管理器上的示例
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.