dl
dl_range_select.h
浏览该文件的文档.
1
12#pragma once
13
14#include <limits>
15#include <vector>
16#include <numeric>
17#include <type_traits>
18
20namespace dl::Select
21{
27template<typename C>
28constexpr auto Max(const C& container)
29{
30 using V = std::decay_t<decltype(container)>;
31 using T = typename V::value_type;
32 T ret = std::numeric_limits<T>::lowest();
33 for (auto& iter : container)
34 {
35 ret = (std::max)(ret, iter);
36 }
37 return ret;
38}
39
44template<typename C>
45constexpr auto Min(const C& container)
46{
47 using V = std::decay_t<decltype(container)>;
48 using T = typename V::value_type;
49 T ret = (std::numeric_limits<T>::max)();
50 for (auto& iter : container)
51 {
52 ret = (std::min)(ret, iter);
53 }
54 return ret;
55}
56
57
63template<typename C, typename F>
64constexpr auto Max(const C& container, F func)
65{
66 using V = std::decay_t<decltype(container)>;
67 using T = typename V::value_type;
68 using T1 = decltype(func(T{}));
69 T1 ret = (std::numeric_limits<T1>::min)();
70 for (auto& iter : container)
71 {
72 ret = (std::max)(ret, func(iter));
73 }
74 return ret;
75}
76
81template<typename C, typename F>
82constexpr auto Min(const C& container, F func)
83{
84 using V = std::decay_t<decltype(container)>;
85 using T = typename V::value_type;
86 using T1 = decltype(func(T{}));
87 T1 ret = (std::numeric_limits<T1>::max)();
88 for (auto& iter : container)
89 {
90 ret = (std::min)(ret, func(iter));
91 }
92 return ret;
93}
94
95
101template<typename C, typename F>
102constexpr auto& MaxRef(C& container, F func)
103{
104 using V = std::decay_t<decltype(container)>;
105 using T = typename V::value_type;
106 using T_RET = std::invoke_result_t<F, T&>;
107 T_RET v_max = (std::numeric_limits<T_RET>::min)();
108 T& ret = *container.begin();
109 for (auto& iter : container)
110 {
111 T_RET v = func(iter);
112 if (v > v_max)
113 {
114 v_max = v;
115 ret = iter;
116 }
117 }
118 return ret;
119}
120
125template<typename C, typename F>
126constexpr auto& MinRef(C& container, F func)
127{
128 using V = std::decay_t<decltype(container)>;
129 using T = typename V::value_type;
130 using T_RET = std::invoke_result_t<F, T&>;
131 T_RET v_min = (std::numeric_limits<T_RET>::max)();
132 T& ret = *container.begin();
133 for (auto& iter : container)
134 {
135 T_RET v = func(iter);
136 if (v < v_min)
137 {
138 v_min = v;
139 ret = iter;
140 }
141 }
142 return ret;
143}
144
145
151template<typename T>
152T& CreateIfEmpty(std::vector<T>& vec, std::size_t n)
153{
154 if (n >= vec.size())
155 vec.resize(n + 1);
156 return vec[n];
157}
158
162template<typename T>
163T* CreateIfEmpty(std::vector<T>* vec, std::size_t n)
164{
165 if (n >= vec->size())
166 vec->resize(n + 1);
167 return &(*vec)[n];
168}
169
172template<typename T>
173T& CreateIfEmpty(std::vector<std::vector<T>>& vec, std::size_t n0, std::size_t n1)
174{
175 if (n0 >= vec.size())
176 vec.resize(n0 + 1);
177 return CreateIfEmpty(vec[n0], n1);
178}
179}
容器选择操作
constexpr auto & MinRef(C &container, F func)
返回容器最小值
T & CreateIfEmpty(std::vector< T > &vec, std::size_t n)
获取容器元素,如果小了,就扩容
constexpr auto Max(const C &container)
返回容器最大值
constexpr auto & MaxRef(C &container, F func)
返回容器最大值
constexpr auto Min(const C &container)
返回容器最小值