Post

C++ STL Container Array

C++ STL Container Array

Array

  • based on gnu 4.9

Container

array traits

1
2
3
4
5
6
7
8
9
10
template<typename _Tp, std::size_t _Nm>
struct __array_traits
{
    // C标准的数组
    typedef _Tp _Type[_Nm];
    // 给一个数组和要查找的位置, 返回数组在该位置的引用
    static constexpr _Tp& _S_ref(const _Type& __t, std::size_t __n) noexcept { 
        return const_cast<_Tp&>(__t[__n]); 
    }
};

array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
    typedef _Tp 	    			      value_type;
    typedef value_type*			      pointer;
    typedef const value_type*                       const_pointer;
    typedef value_type&                   	      reference;
    typedef const value_type&             	      const_reference;
    typedef value_type*          		      iterator;
    typedef const value_type*			      const_iterator;
    typedef std::size_t                    	      size_type;
    typedef std::ptrdiff_t                   	      difference_type;
    typedef std::reverse_iterator<iterator>	      reverse_iterator;
    typedef std::reverse_iterator<const_iterator>   const_reverse_iterator;    
*/
template<typename _Tp, std::size_t _Nm>
struct array
{
    typedef _GLIBCXX_STD_C::__array_traits<_Tp, _Nm> _AT_Type;
    // 申明了一个首地址_Tp, size为_Nm的数组_M_elems
    typename _AT_Type::_Type                         _M_elems;
    // Iterators.
    iterator begin() noexcept { 
        return iterator(data()); 
    }
    iterator end() noexcept { 
        return iterator(data() + _Nm); 
    }
    // 返回_M_elems的首地址
    pointer data() noexcept { 
        return std::__addressof(_AT_Type::_S_ref(_M_elems, 0)); 
    }
    // reference
    reference front() noexcept { 
        return *begin(); 
    }
    reference back() noexcept { 
        return _Nm ? *(end() - 1) : *end(); 
    }
    // Element access.
    reference operator[](size_type __n) noexcept { 
        return _AT_Type::_S_ref(_M_elems, __n); 
    }
    constexpr const_reference operator[](size_type __n) const noexcept { 
        return _AT_Type::_S_ref(_M_elems, __n); 
    }
    // Capacity.
    constexpr size_type size() const noexcept { 
        return _Nm; 
    }
    constexpr size_type max_size() const noexcept { 
        return _Nm; 
    }
    constexpr bool empty() const noexcept { 
        return size() == 0; 
    }
}
This post is licensed under CC BY 4.0 by the author.