一、为什么包装成容器呢?
array数组包装成容器,那么就要遵循容器的规则:比如提供iterator等等
否则被摒弃在整个六大部件之外,不能享受算法等。
二、数据结构
//TR1
template <typename _Tp,std::size_t _Nm>
struct array{
public:
typedef _Tp value_type;
typedef _Tp* pointer;
typedef value_type* iterator;
value_type _M_instance[_Nm?_Nm:1];
iterator begin(){return &_M_instance[0];}
iterator end() {return &_M_instance[_Nm];}
};
array<int,10> myArray;
//G 4.9
template <typename _Tp,std::size_t _Nm>
struct __array_traits
{
typedef _Tp_Type[_Nm];
static constexpr _Tp& _S_ref(const _Type& __t,std::size_t __n) noexcept{return const _cast<_Tp&>(_t[__n]);}
};
template <typename _Tp,std::size_t _Nm>
struct array{
public:
typedef _Tp value_type;
typedef value_type* pointer;
typedef value_type& reference;
typedef value_type* iterator;
typedef std::size_t size_type;
typedef _GLIBCXX_STD_C::_array_traits<_Tp,_Nm> _AT_Type;
typename _AT_Type::_Type _M_elems;
iterator begin() noexcept {return iterator(data());}
iterator end() noexcept {return iterator(data()+_Nm);}
constexpr size_type size() const noexcept {return _Nm;}
reference operator[](size_type __n) noexcept
{ //没有边检
return _AT_Type::_S_ref(_M_elemes,__n);
}
reference at(size_type __n)
{//有边检
if(__n>=_Nm) std::__throw_out_pf_range_fmt(...);
return _AT_Type::S_ref(_M_elems,__n);
}
pointer data() noexcept
{
return std::__addressof(_AT_Type::S_ref(_M_elems,0));
}
};
template<typename _Tp,std::size_t _Nm>
struct _array_traits
{
typedef _Tp_Type[_Nm];
/*
限制了:
int a[100]; //OK
int[100] b; //fail
typedef int T[100];
T c;//OK
*/
static constexpr _Tp& _S_ref(const _Type& __t,std::size_t __n) noexcept
{
return const_cast<_Tp&>(__t[__n]);
}
};