有沒有簡單的方法來獲取C++數組的切片?切片std :: array
也就是說,我有
array<double, 10> arr10;
,並希望得到數組包含arr10
五個第一要素:
array<double, 5> arr5 = arr10.???
(除通過第一循環訪問數組填充它)
有沒有簡單的方法來獲取C++數組的切片?切片std :: array
也就是說,我有
array<double, 10> arr10;
,並希望得到數組包含arr10
五個第一要素:
array<double, 5> arr5 = arr10.???
(除通過第一循環訪問數組填充它)
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());
當然。寫到這:
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);
避免了所有的循環,顯式或隱式的。
一對迭代器是距離切片最近的C++。像Boost.Range這樣的東西可以讓你將它們一起打包成一個片狀物體。 –