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
{1}}?
答案 0 :(得分:1)
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));
可以修改为与我怀疑的非随机访问迭代器一起使用。
答案 1 :(得分:0)
您可以定义 custom_array ,它继承自标准的std :: 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());