9.C++ STL之array

一、为什么包装成容器呢?

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]);
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值