簡體   English   中英

將向量拆分為向量數組

[英]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() ,則這是一個硬錯誤,因此這實際上很容易解決。 基本邏輯是:

  1. 檢查輸入是否可以正確拆分(失敗時拋出)
  2. 結果在數組中創建N向量
  3. 為該數組中的每個向量為vec.size() / N保留空間(可選)
  4. 在每個向量中存儲來自原始vec vec.size() / N (基本上,循環遍歷vec.size() / N來自vec元素,並存儲在結果向量中)

由於結果是std::array ,大小必須靜態指定——這意味着用戶能夠指定這個數字,只能使用Ntemplate非類型參數來完成。 例如:

#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM