dl
dl_range_every.h
浏览该文件的文档.
1
12#pragma once
13
14#include <algorithm>
15#include <cmath>
16
17#include "math/dl_algorithm.h"
19namespace dl::Every
20{
24template<typename C, typename T>
25void Add(C& c, const T& v)
26{
27 for (auto& iter : c)
28 iter += v;
29}
30template<typename C, typename T>
31[[nodiscard]]
32C Add(const C& c, const T& v)
33{
34 C ret = c;
35 Add(ret, v);
36 return ret;
37}
38
41template<typename C, typename T>
42void Sub(C& c, const T& v)
43{
44 for (auto& iter : c)
45 iter -= v;
46}
47template<typename C, typename T>
48[[nodiscard]]
49C Sub(const C& c, const T& v)
50{
51 C ret = c;
52 Sub(ret, v);
53 return ret;
54}
55
58template<typename C, typename T>
59void Mul(C& c, const T& v)
60{
61 for (auto& iter : c)
62 iter *= v;
63}
64template<typename C, typename T>
65[[nodiscard]]
66C Mul(const C& c, const T& v)
67{
68 C ret = c;
69 Mul(ret, v);
70 return ret;
71}
72
75template<typename C>
76void Round(C& c)
77{
78 for (auto& iter : c)
79 iter = std::round(iter);
80}
81template<typename C>
82[[nodiscard]]
83C Round(const C& c)
84{
85 C ret = c;
86 Round(ret);
87 return ret;
88}
89
90
94template<typename C>
95void Floor(C& c)
96{
97 for (auto& iter : c)
98 iter = std::floor(iter);
99}
100template<typename C>
101[[nodiscard]]
102C Floor(const C& c)
103{
104 C ret = c;
105 Floor(ret);
106 return ret;
107}
108
111template<typename C>
112void Ceil(C& c)
113{
114 for (auto& iter : c)
115 iter = std::ceil(iter);
116}
117template<typename C>
118[[nodiscard]]
119C Ceil(const C& c)
120{
121 C ret = c;
122 Ceil(ret);
123 return ret;
124}
125
129template<typename C, typename T>
130constexpr void Clamp(C& c, const T& v_min, const T& v_max)
131{
132 for (auto& iter : c)
133 iter = std::clamp(iter, v_min, v_max);
134}
135template<typename C, typename T>
136[[nodiscard]]
137constexpr C Clamp(const C& c, const T& v_min, const T& v_max)
138{
139 C ret = c;
140 Clamp(ret, v_min, v_max);
141 return ret;
142}
143
147template<typename C, typename T>
148constexpr void ClampFloor(C& c, const T& v_min)
149{
150 for (auto& iter : c)
151 {
152 if (iter < v_min)
153 iter = v_min;
154 }
155}
156template<typename C, typename T>
157[[nodiscard]]
158constexpr C ClampFloor(const C& c, const T& v_min)
159{
160 C ret = c;
161 ClampFloor(ret, v_min);
162 return ret;
163}
164
168template<typename C>
169void Saturate(C& c)
170{
171 for (auto& iter : c)
172 iter = saturate(iter);
173}
174template<typename C>
175[[nodiscard]]
176C Saturate(const C& c)
177{
178 C ret = c;
179 Saturate(ret);
180 return ret;
181}
182
186template<typename C>
187void Abs(C& c)
188{
189 for (auto& iter : c)
190 iter = std::abs(iter);
191}
192template<typename C>
193[[nodiscard]]
194C Abs(const C& c)
195{
196 C ret = c;
197 Abs(ret);
198 return ret;
199}
200
201
207template<typename C, typename V>
208bool Equal(const C& c, const V& v)
209{
210 for (auto& iter : c)
211 {
212 if (iter != v)
213 return false;
214 }
215 return true;
216}
217
223template<typename C, typename V>
224bool NotEqual(const C& container, const V& v)
225{
226 for (auto& iter : container)
227 {
228 if (iter == v)
229 return false;
230 }
231 return true;
232}
233
234
235template<typename C>
236bool Zero(const C& c)
237{
238 return Equal(c, 0);
239}
240
246template<typename C, typename V>
247void Erase(C& container, const V& v)
248{
249 for (auto iter = container.begin(); iter != container.end();)
250 {
251 if (*iter == v)
252 iter = container.erase(iter);
253 else
254 ++iter;
255 }
256}
257
262template<typename C, typename V>
263[[nodiscard]]
264C Erase(const C& c, const V& v)
265{
266 C ret;
267 for (auto& iter : c)
268 {
269 if (iter != v)
270 ret.push_back(iter);
271 }
272 return ret;
273}
274
280template<typename C, typename C1>
281size_t EraseNot(C& container, const C1& c_compare)
282{
283 size_t ret = 0;
284 for (auto iter = container.begin(); iter != container.end();)
285 {
286 auto iter1 = find(c_compare.begin(), c_compare.end(), *iter);
287 if (iter1 == c_compare.end())
288 {
289 iter = container.erase(iter);
290 ++ret;
291 }
292 else
293 ++iter;
294 }
295 return ret;
296}
297
304template<typename C, typename V>
305void Replace(C& c, const V& v, const V& v_new)
306{
307 for (auto& iter : c)
308 {
309 if (iter == v)
310 iter = v_new;
311 }
312}
313
319template<typename C, typename V>
320[[nodiscard]]
321C Replace(const C& c, const V& v, const V& v_new)
322{
323 C ret = c;
324 Replace(ret, v, v_new);
325 return ret;
326}
327
333template<typename C>
334void Delete(C& c, bool clear = true)
335{
336 for (auto& iter : c)
337 {
338 delete iter;
339 }
340 if (clear)
341 c.clear();
342}
343}
多对一操作
bool Equal(const C &c, const V &v)
判断容器所有元素都等于某值
void Erase(C &container, const V &v)
移除容器所有元素都等于某值
bool Zero(const C &c)
void Delete(C &c, bool clear=true)
对容器每个元素进行delete操作
void Round(C &c)
四舍五入
void Saturate(C &c)
取[0, 1]
void Replace(C &c, const V &v, const V &v_new)
替换容器所有元素都等于某值
void Abs(C &c)
取绝对值
void Sub(C &c, const T &v)
size_t EraseNot(C &container, const C1 &c_compare)
移除容器所有元素 不在比较的容器
void Mul(C &c, const T &v)
void Floor(C &c)
取下界
void Add(C &c, const T &v)
constexpr void Clamp(C &c, const T &v_min, const T &v_max)
取[min, max]
void Ceil(C &c)
取上界
constexpr void ClampFloor(C &c, const T &v_min)
取[min, +∞)
bool NotEqual(const C &container, const V &v)
判断容器所有元素都 不等于某值
constexpr T saturate(const T &x)
限制数值到 [0, 1]