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

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

本文关键字:数组 切片 std 我应该      更新时间:2023-10-16

对于constexpr I和k,我想将std::array的元素I到I+k-1表示为另一个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);

您要的是arrayslice,甚至可能是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(测试)实现: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);