对于constexpr i和k,我想通过std::array
的i + k-1表示另一个std::array
中的元素i - 最好没有复制并且在constexpr函数中。我应该如何构建一个更小的std :: array作为一个更大的切片?
可以这样做吗?如果是这样,那么解决这个问题的正确方法是什么?
对于constexpr i和k,我想通过std::array
的i + k-1表示另一个std::array
中的元素i - 最好没有复制并且在constexpr函数中。我应该如何构建一个更小的std :: array作为一个更大的切片?
可以这样做吗?如果是这样,那么解决这个问题的正确方法是什么?
复制是不可避免的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);
你所问的是一个array
的slice
或甚至可能是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};
我实现片(试验):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);
你怎么能这么肯定你必须在这里有一个数组?如果是这样的话,我倾向于认为这里存在XY问题。如果你能描述那些让你觉得你需要这样的不寻常的情况,那么也许我们可以想出一个可以实际工作的解决方案。 –
@einpoklum在阅读完这篇文章后,我感到困惑:“跨度非常好,我知道跨度,这就是我在这之后所做的。那为什么不使用'span'? – Arunmu
@Arunmu:错过了一个“不”:跨度不适合我 - 我需要一个正确的'std :: array'。好吧,“需要”是一项强有力的工作,假设我会“非常需要”一个std ::数组。跨度非常好,我知道跨度,只是不知道我在这里之后。 – einpoklum
你为什么这么肯定复印是必然?我提供了一个我认为不能复制的难看答案,请看看。 – einpoklum
你的丑陋答案不起作用。它依赖于未定义的行为。 –
@ R.MartinhoFernandes:你的意思是_my_丑陋的答案?因为你在评论Leon的。 – einpoklum