繁体   English   中英

我应该如何将较小的std :: array构造为较大的切片?

[英]How should I construct a smaller std::array as a slice of a larger one?

我想将std::array元素i到i + k-1表示为constexpr i和k的另一个std::array ,最好是不复制并且在constexpr函数中。

能做到吗? 如果是这样,解决此问题的正确方法是什么?

使用std::array不可避免地进行复制。 如果可以使用Microsoft指南支持库中的 span<T, N> ,则可以避免复制。

如果您必须坚持使用std::array那么可以引入以下辅助函数:

template<std::size_t OFFSET, std::size_t K, class T, std::size_t N>
std::array<T, K>
subarray(const std::array<T, N>& a)
{
    static_assert(OFFSET+K<=N, "your error message here");

    std::array<T, K> s;
    std::copy(a.begin()+OFFSET, a.begin()+OFFSET+K, s.begin());
    return s;
};

像这样使用它:

std::array<int, 5> a = { 1, 2, 3, 4, 5 };
std::array<int, 3> s = subarray<1, 3>(a);

您要的是slice array甚至可能是vector 遗憾的是,标准库中没有任何内容(直到C ++ 17),但是正如Leon在他的回答中提到的那样,您可以使用span来实现。

GSL实施: https//github.com/Microsoft/GSL/blob/master/include/span.h

std::array<int, 4> arr = {1, 2, 3, 4};
span<int> s{&arr[0], 2};

我对slice(test)的实现: https : //github.com/arun11299/Slices-in-Cpp \\

std::vector<int> vec{1,2,3,4,5,6,7,8,9,10};

// all elements
auto vslice = make_slice(vec, 0, vec.size());
assert(len(vslice) == 10);

vslice = vslice(beg, 8);

assert(len(vslice) == 8);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM