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.