2016-06-12 21 views

回答

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); 
+0

你为什么这么肯定复印是必然?我提供了一个我认为不能复制的难看答案,请看看。 – einpoklum

+1

你的丑陋答案不起作用。它依赖于未定义的行为。 –

+0

@ R.MartinhoFernandes:你的意思是_my_丑陋的答案?因为你在评论Leon的。 – einpoklum

2

你所问的是一个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}; 

我实现片(试验):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); 
+2

你怎么能这么肯定你必须在这里有一个数组?如果是这样的话,我倾向于认为这里存在XY问题。如果你能描述那些让你觉得你需要这样的不寻常的情况,那么也许我们可以想出一个可以实际工作的解决方案。 –

+0

@einpoklum在阅读完这篇文章后,我感到困惑:“跨度非常好,我知道跨度,这就是我在这之后所做的。那为什么不使用'span'? – Arunmu

+0

@Arunmu:错过了一个“不”:跨度不适合我 - 我需要一个正确的'std :: array'。好吧,“需要”是一项强有力的工作,假设我会“非常需要”一个std ::数组。跨度非常好,我知道跨度,只是不知道我在这里之后。 – einpoklum

相关问题