繁体   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