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