我想将std::array
的元素i到i + k-1表示为另一个std::array
,对于constexpr i和k - 最好没有复制并且在constexpr函数中。
可以这样做吗?如果是这样,那么正确的方法是什么?
答案 0 :(得分:2)
使用std::array
进行复制是不可避免的。如果您可以使用Microsoft Guideline Support Library中的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);
答案 1 :(得分:2)
您要问的是slice
array
或vector
甚至span
。遗憾的是,我们在标准库中没有任何东西(直到C ++ 17),但正如Leon在他的回答中提到的那样,你可以使用std::array<int, 4> arr = {1, 2, 3, 4};
span<int> s{&arr[0], 2};
。
GSL实施:https://github.com/Microsoft/GSL/blob/master/include/span.h
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);
我对slice(test)的实现:https://github.com/arun11299/Slices-in-Cpp \
{{1}}