是否可以使用 begin() 和 end() 创建 std::array?


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());

最新更新