std::array
本质
std::array概括来说是一个封装了固定大小的数组,即只有一个成员变量就是声明时的类型和大小的数组,并封装一层迭代器构成的满足连续容器和序列容器要求的容器便捷操作接口。
_EXPORT_STD template <class _Ty, size_t _Size>
class array { // fixed size array of values
public
... 若干迭代器操纵元素
_NODISCARD _CONSTEXPR17 iterator begin() noexcept {
return iterator(_Elems, 0);
}
_NODISCARD_EMPTY_ARRAY_MEMBER constexpr bool empty() const noexcept {
return false;
}
_Ty _Elems[_Size];
}
特化数量为0的array,因为结果已知,所以容器便捷操作接口都是简易化
template <class _Ty>
class array<_Ty, 0> {
public:
... 一系列空数据时该返回的结果,减少消耗
_NODISCARD _CONSTEXPR17 iterator begin() noexcept {
return iterator{};
}
_NODISCARD_EMPTY_ARRAY_MEMBER constexpr bool empty() const noexcept {
return true;
}
conditional_t<disjunction_v<is_default_constructible<_Ty>, _Is_implicitly_default_constructible<_Ty>>, _Ty,
_Empty_array_element>
_Elems[1]{};
}
迭代器本身只存着一个指针,存放在const迭代器里,普通可操作迭代器是继承const迭代器,并不修改的操作const迭代器本身函数,要修改的用const_cast转化出来并输出
template <class _Ty, size_t _Size>
class _Array_const_iterator
{
using pointer = const _Ty*;
private:
pointer _Ptr; // beginning of array
template <class _Ty, size_t _Size>
class _Array_iterator : public _Array_const_iterator<_Ty, _Size> {
public:
using _Mybase = _Array_const_iterator<_Ty, _Size>;
using pointer = _Ty*;
_NODISCARD _CONSTEXPR17 pointer operator->() const noexcept {
return const_cast<pointer>(_Mybase::operator->());
}
_CONSTEXPR17 _Array_iterator operator++(int) noexcept {
_Array_iterator _Tmp = *this;
_Mybase::operator++();
return _Tmp;
}

1327

被折叠的 条评论
为什么被折叠?



