C++ std::array浅析

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

溪渣渣_梁世华

打赏?我甚至没有任何收费的章节

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值