NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
numeric.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_ALGORITHM_NUMERIC_HPP__
2#define NEFORCE_CORE_ALGORITHM_NUMERIC_HPP__
3
11
14NEFORCE_BEGIN_NAMESPACE__
15
21
27
41template <typename Iterator, typename T, typename BinaryOperation>
42NEFORCE_CONSTEXPR20 T accumulate(Iterator first, Iterator second, T init, BinaryOperation binary_op) {
43 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
44 for (; first != second; ++first) {
45 init = binary_op(init, *first);
46 }
47 return init;
48}
49
61template <typename Iterator, typename T>
62NEFORCE_CONSTEXPR20 T accumulate(Iterator first, Iterator second, T init) {
63 return _NEFORCE accumulate(first, second, init, _NEFORCE plus<T>());
64}
65
79template <typename Iterator1, typename Iterator2, typename BinaryOperation>
80NEFORCE_CONSTEXPR20 Iterator2 adjacent_difference(Iterator1 first, Iterator1 last, Iterator2 result,
81 BinaryOperation binary_op) {
83 "Iterator must be input_iterator");
84
85 if (first == last) {
86 return result;
87 }
88
90 *result = *first;
91 T value = *first;
92
93 while (++first != last) {
94 T tem = *first;
95 *++result = binary_op(tem, value);
96 value = tem;
97 }
98 return ++result;
99}
100
112template <typename Iterator1, typename Iterator2>
113NEFORCE_CONSTEXPR20 Iterator2 adjacent_difference(Iterator1 first, Iterator1 last, Iterator2 result) {
114 return _NEFORCE adjacent_difference(first, last, result, _NEFORCE minus<iter_value_t<Iterator1>>());
115}
116
134template <typename Iterator1, typename Iterator2, typename T, typename BinaryOperation1, typename BinaryOperation2>
135NEFORCE_CONSTEXPR20 T inner_product(Iterator1 first1, Iterator1 last1, Iterator2 first2, T init,
136 BinaryOperation1 binary_op1, BinaryOperation2 binary_op2) {
137
139 "Iterator must be input_iterator");
140
141 for (; first1 != last1; ++first1, ++first2) {
142 init = binary_op1(init, binary_op2(*first1, *first2));
143 }
144 return init;
145}
146
160template <typename Iterator1, typename Iterator2, typename T>
161NEFORCE_CONSTEXPR20 T inner_product(Iterator1 first1, Iterator1 last1, Iterator2 first2, T init) {
162 return _NEFORCE inner_product(first1, last1, first2, init, _NEFORCE plus<T>(), _NEFORCE multiplies<T>());
163}
164
178template <typename Iterator1, typename Iterator2, typename BinaryOperation>
179NEFORCE_CONSTEXPR20 Iterator2 partial_sum(Iterator1 first, Iterator1 last, Iterator2 result,
180 BinaryOperation binary_op) {
182 "Iterator must be input_iterator");
183
184 if (first == last) {
185 return result;
186 }
187
188 *result = *first;
189 iter_value_t<Iterator1> value = *first;
190
191 while (++first != last) {
192 value = binary_op(value, *first);
193 *++result = value;
194 }
195 return ++result;
196}
197
209template <typename Iterator1, typename Iterator2>
210NEFORCE_CONSTEXPR20 Iterator2 partial_sum(Iterator1 first, Iterator1 last, Iterator2 result) {
211 return _NEFORCE partial_sum(first, last, result, _NEFORCE plus<iter_value_t<Iterator1>>());
212}
213
224template <typename Iterator, typename T>
225NEFORCE_CONSTEXPR20 void sequence_fill(Iterator first, Iterator last, T value) {
226 static_assert(is_ranges_input_iter_v<Iterator>, "Iterator must be input_iterator");
227
228 while (first != last) {
229 *first++ = value;
230 ++value;
231 }
232}
233 // NumericAlgorithms
235 // StandardAlgorithms
237
238NEFORCE_END_NAMESPACE__
239#endif // NEFORCE_CORE_ALGORITHM_NUMERIC_HPP__
概念和类型约束
仿函数
NEFORCE_INLINE17 constexpr bool is_ranges_input_iter_v
检查是否为范围输入迭代器
typename iterator_traits< Iterator >::value_type iter_value_t
获取迭代器的值类型
NEFORCE_CONSTEXPR20 void sequence_fill(Iterator first, Iterator last, T value)
顺序填充递增序列
NEFORCE_CONSTEXPR20 T accumulate(Iterator first, Iterator second, T init, BinaryOperation binary_op)
累积计算
NEFORCE_CONSTEXPR20 Iterator2 adjacent_difference(Iterator1 first, Iterator1 last, Iterator2 result, BinaryOperation binary_op)
相邻差分计算
NEFORCE_CONSTEXPR20 Iterator2 partial_sum(Iterator1 first, Iterator1 last, Iterator2 result, BinaryOperation binary_op)
部分和计算
NEFORCE_CONSTEXPR20 T inner_product(Iterator1 first1, Iterator1 last1, Iterator2 first2, T init, BinaryOperation1 binary_op1, BinaryOperation2 binary_op2)
内积计算
减法运算仿函数
乘法运算仿函数
加法运算仿函数