std::array<int, 4> myarray = {1, 2, 3, 4};
std::array<int, 4> myarray2(std::begin(myarray),std::end(myarray)); //It throws error
如果我创建myarray2
的唯一方法是将两个std::array<int, 4>::iterator
传递给构造函数,我是否可以使用std::array
来制作它,或者我必须使用vector
?
template<class T, std::size_t N, class It>
std::array<T,N> array_from_iterator(It it){
return indexer<N>()(
[it](auto...Is)->std::array<T,N>
{
return { (*(it+Is))... };
}
);
}
indexer
在哪里:
template<class=void,std::size_t...Is>
auto indexer(std::index_sequence<Is...>){
return [](auto&&f)->decltype(auto){
return decltype(f)(f)( std::integral_constant<std::size_t,Is>{}... );
};
}
template<std::size_t N>
auto indexer(){
return indexer(std::make_index_sequence<N>{});
}
这为我们扩展了参数包。 不进行边界检查。 未编译,可能有 tpyos。
C++14,我不保证MSVC能够正常工作。
std::array<int, 4> myarray2 = array_from_iterator<int,4>(std::begin(myarray));
我怀疑可以修改以使用非随机访问迭代器。
> 您可以定义从标准 std::array 继承的custom_array。
template<typename _T, size_t _size>
class custom_array : public std::array<_T, _size> {
public:
custom_array(std::array<_T, _size> arr,
size_t start,
size_t end) {
size_t itr = 0;
while (itr < this->size() &&
start < arr.size() &&
start <= end) {
this->_Elems[itr++] = arr[start++];
}
}
custom_array(std::array<_T, _size>::iterator start,
std::array<_T, _size>::iterator end) {
size_t itr = 0;
while (itr < this->size()) {
this->_Elems[itr++] = *start;
start++;
if (start == end) { break; }
}
}
};
然后,您可以根据需要声明custom_array,例如:
std::array<int, 4> arr = { 1, 2, 3, 4 };
custom_array<int, 4> arr_1(a, 0, 4);
custom_array<int, 4> arr_2(a.begin(), a.end());