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

时间:2016-12-06 17:05:07

标签: c++ arrays constructor

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}}?

2 个答案:

答案 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());
相关问题