[英]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.