我应该如何构建一个较小的std :: array作为较大的一个片段?

时间:2016-06-12 16:06:54

标签: c++ c++11 subset idiomatic stdarray

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

可以这样做吗?如果是这样,那么正确的方法是什么?

2 个答案:

答案 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 arrayvector甚至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}}