-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathArray.hpp
More file actions
183 lines (152 loc) · 4.34 KB
/
Array.hpp
File metadata and controls
183 lines (152 loc) · 4.34 KB
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#pragma once
#include <iostream>
#include<vector>
//#include<array>
#include<cstdio>
#include<string>
#include<cstddef>
#include<cstdint>
#define _LONG_CXX_THROW_OUT_OF_RANGE(__capacity,_N) [[_UNLIKELY]] throw std::runtime_error("out of range! index = " + std::to_string(__capacity__) + ". Array size =" + std::to_string(_N));
//优化思路,size_t自动适配32或64位处理器
template<class _Tp, size_t _N>
struct Array {
using iterator = _Tp*;
using const_iterator = _Tp const*;
_Tp _M_elements[_N];
//重载运算符呈现arr[]效果
_Tp& operator[](int arr_flag) {
return _M_elements[arr_flag];
}
_Tp const& operator[](int arr_flag) const {
return _M_elements[arr_flag];
}
_Tp& front() {
return _M_elements[0];
}
_Tp const& front() const {
return _M_elements[0];
}
_Tp& back() {
return _M_elements[_N - 1];
}
_Tp const& back() const {
return _M_elements[_N - 1];
}
//优化:异常处理超限,越界问题
_Tp& at(size_t __capacity__) {
if (__capacity__ >= _N) {
_LONG_CXX_THROW_OUT_OF_RANGE(__capacity__, _N);
}
return _M_elements[__capacity__];
}
//const版本,注意引用形式来避免拷贝浪费空间
_Tp const& at(size_t __capacity__) const {
if (__capacity__ >= _N) {
//unlikely关键字来优化编译器,让其对该语句的执行有内部分析
_LONG_CXX_THROW_OUT_OF_RANGE(__capacity__, _N);
}
return _M_elements[__capacity__];
}
//静态成员变量size,加上constexpr可以在编译期就初始化
static constexpr size_t size() {
return _N;
}
_Tp const* begin() const {
return _M_elements;
}
_Tp const* end() const {
return _M_elements + _N;
}
_Tp* begin() {
return _M_elements;
}
_Tp* end() {
return _M_elements + _N;
}
void fill(_Tp const& __value) noexcept(std::is_nothrow_assignable_v<_Tp>) {
for (auto& __index : _M_elements) {
__index = __value;
}
}
//swap实现两个下标的数据交换
void swap_two_ele(_Tp const __it1, _Tp const __it2) {
auto __mid = 0;
__mid = _M_elements[__it1];
_M_elements[__it1] = _M_elements[__it2];
_M_elements[__it2] = __mid;
}
void swap(Array& __that) noexcept(std::is_nothrow_assignable_v<_Tp>) {
for (size_t __index = 0; __index < (this->size > __that.size() ? __that.size() : this->size()); __index++) {
std::swap(_M_elements[__index], __that._M_elements[__index]);
}
}
/*void fill(T const& value) {
for (size_t i = 0; i < N; i++) {
m_elements[i] = value;
}
}*/
};
//规定不同编译器的执行逻辑
#if defined(_MSC_VER)
#define _ST1W_UNREACHABLE __assume(0)//跳过不执行
#elif defined(__GNUC__)
#define ST1W_UNREACHABLE __builtin_unreachable(0)
#endif
template<class __Tp>
struct Array<__Tp, 0> {
using iterator = __Tp*;
using const_iterator = __Tp const*;
//重载运算符呈现arr[]效果
__Tp& operator[](int __arr_flag) noexcept {
_ST1W_UNREACHABLE;
}
__Tp const& operator[](int __arr_flag) const {
_ST1W_UNREACHABLE;
}
__Tp& front() {
_ST1W_UNREACHABLE;
}
__Tp const& front() const {
_ST1W_UNREACHABLE;
}
__Tp& back() {
_ST1W_UNREACHABLE;
}
__Tp const& back() const {
_ST1W_UNREACHABLE;
}
//优化:异常处理超限,越界问题
__Tp& at(size_t __capacity__) {
_LONG_CXX_THROW_OUT_OF_RANGE(__capacity__, 0);
}
//const版本,注意引用形式来避免拷贝浪费空间
__Tp const& at(size_t __capacity__) const {
_LONG_CXX_THROW_OUT_OF_RANGE(__capacity__, 0);
}
//静态成员变量size,加上constexpr可以在编译期就初始化
static constexpr size_t size() {
_ST1W_UNREACHABLE;
}
__Tp const* begin() const {
return nullptr;
}
__Tp const* end() const {
return nullptr;
}
__Tp* begin() {
return nullptr;
}
__Tp* end() {
return nullptr;
}
void fill(__Tp const& value) noexcept(std::is_nothrow_assignable_v<__Tp>) {
}
//swap实现两个下标的数据交换
void swap_two_ele(__Tp const it1, __Tp const it2) noexcept(std::is_nothrow_assignable_v<__Tp>) {
}
/*void fill(T const& value) {
for (size_t i = 0; i < N; i++) {
m_elements[i] = value;
}
}*/
};