我们接着Vector(二)来继续解析代码。
public:
iterator begin() { return _M_start; }//这里的iterator这是一个类型指针,这里的意思是返回一个类型指针。
const_iterator begin() const { return _M_start; }
iterator end() { return _M_finish; }
const_iterator end() const { return _M_finish; }
reverse_iterator rbegin()//reverse_iterator反向指针
{
return reverse_iterator(end());//实现一个反向指针了,就是在开始的位置返回结尾的位置。
}
const_reverse_iterator rbegin() const
{
return const_reverse_iterator(end());
}
reverse_iterator rend()
{
return reverse_iterator(begin());
}
const_reverse_iterator rend() const
{
return const_reverse_iterator(begin());
}
size_type size() const//空间的长度
{
return size_type(end() - begin());//总空间-开始位置=空间的长度
}
size_type max_size() const
{
return size_type(-1) / sizeof(_Tp);/*最大空间,size_type是UINT类型的,UINT类型-1就是最大值,
#define UINT_MAX 0xffffffff maximum unsigned int value。
size_type(-1) 就是Windows.h里面的一个UINT_MAX的宏。
最大长度/类型大小=最大空间长度。
*/
}
size_type capacity() const
{
return size_type(_M_end_of_storage - begin());//总空间-开始位置=容积
}
bool empty() const
{
return begin() == end();//这样写很节约资源。效率很高
}
reference operator[](size_type __n) { return *(begin() + __n); }//重载[]。
const_reference operator[](size_type __n) const { return *(begin() + __n); }
这一段算法没什么好说的,很简单,大家自己看看得了。接下来我们分析下#ifdef __STL_THROW_RANGE_ERRORS 范围异常里面的代码做详解。
#define __STL_THROW_RANGE_ERRORS
#ifdef __STL_THROW_RANGE_ERRORS//确定是否抛出范围异常的宏,有时候超出了范围但是不希望抛出范围异常。
void _M_range_check(size_type __n) const //范围检查
{
if (__n >= this->size()) //检查空间长度是否超出了空间的大小。
__stl_throw_range_error("vector");
}
reference at(size_type __n)//at是会进行范围检测的,如果超出了范围就会抛出异常。
{
_M_range_check(__n);
return (*this)[__n];//返回一个指定位置的值,这里的[]就是上面重载了的[]。
}
const_reference at(size_type __n) const //Const版本的at。
{
_M_range_check(__n);
return (*this)[__n];
}
#endif /* __STL_THROW_RANGE_ERRORS */