2013-05-20 64 views
3

有沒有簡單的方法來獲取C++數組的切片?切片std :: array

也就是說,我有

array<double, 10> arr10; 

,並希望得到數組包含arr10五個第一要素:

array<double, 5> arr5 = arr10.??? 

(除通過第一循環訪問數組填充它)

+0

一對迭代器是距離切片最近的C++。像Boost.Range這樣的東西可以讓你將它們一起打包成一個片狀物體。 –

回答

3

std::array的構造函數是隱式定義的,所以你不能用另一個容器或迭代器的範圍初始化它。您可以得到最接近的是創建一個幫助功能,在施工過程中負責複製。這允許單相初始化,這是我相信你試圖實現的。

template<class X, class Y> 
X CopyArray(const Y& src, const size_t size) 
{ 
    X dst; 
    std::copy(src.begin(), src.begin() + 5, dst.begin()); 
    return dst; 
} 
std::array<int, 5> arr5 = CopyArray<decltype(arr5)>(arr10, 5); 

您也可以使用類似std::copy或通過複製自己的迭代。

std::copy(arr10.begin(), arr10.begin() + 5, arr5.begin()); 
2

當然。寫到這:

template<int> struct seq {}; 
template<typename seq> struct seq_len; 
template<template<int...>class seq,int s0,int...s> 
struct seq_len<seq<s0,s...>>:std::integral_constant<std::size_t,seq_len<seq<s...>>::value> {}; 
template<template<int...>class seq,> 
struct seq_len<seq<>:std::integral_constant<std::size_t,0> {}; 
template<int Min, int Max, int... s> 
struct make_seq: make_seq<Min, Max-1, Max-1, s...> {}; 
template<int Min, int... s> 
struct make_seq<Min, Min, s...> { 
    typedef seq<s...> type; 
}; 
template<int Max, int Min=0> 
using MakeSeq = typename make_seq<Min,Max>::type; 

template<std::size_t src, typename T, int... indexes> 
std::array<T, sizeof...(indexes)> get_elements(seq<indexes...>, std::array<T, src > const& inp) { 
    return { inp[indexes]... }; 
} 
template<int len, std::size_t src, typename T> 
auto first_elements(std::array<T, src > const& inp) 
    -> decltype(get_elements(inp, MakeSeq<len>()) 
{ 
    return get_elements(inp, MakeSeq<len>()); 
} 

凡編譯時indexes...不重新映射,並MakeSeq使得從0到n-1起。 (支持get_elements)和前n(通過first_elements)。

用途:

std::array< int, 10 > arr = {0,1,2,3,4,5,6,7,8,9}; 
std::array< int, 6 > slice = get_elements(arr, seq<2,0,7,3,1,0>()); 
std::array< int, 5 > start = first_elements<5>(arr); 

避免了所有的循環,顯式或隱式的。