1#ifndef NEFORCE_CORE_ALGORITHM_NUMERIC_HPP__
2#define NEFORCE_CORE_ALGORITHM_NUMERIC_HPP__
14NEFORCE_BEGIN_NAMESPACE__
41template <
typename Iterator,
typename T,
typename BinaryOperation>
42NEFORCE_CONSTEXPR20 T
accumulate(Iterator first, Iterator second, T init, BinaryOperation binary_op) {
44 for (; first != second; ++first) {
45 init = binary_op(init, *first);
61template <
typename Iterator,
typename T>
62NEFORCE_CONSTEXPR20 T
accumulate(Iterator first, Iterator second, T init) {
79template <
typename Iterator1,
typename Iterator2,
typename BinaryOperation>
81 BinaryOperation binary_op) {
83 "Iterator must be input_iterator");
93 while (++first != last) {
95 *++result = binary_op(tem, value);
112template <
typename Iterator1,
typename Iterator2>
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) {
139 "Iterator must be input_iterator");
141 for (; first1 != last1; ++first1, ++first2) {
142 init = binary_op1(init, binary_op2(*first1, *first2));
160template <
typename Iterator1,
typename Iterator2,
typename T>
161NEFORCE_CONSTEXPR20 T
inner_product(Iterator1 first1, Iterator1 last1, Iterator2 first2, T init) {
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");
191 while (++first != last) {
192 value = binary_op(value, *first);
209template <
typename Iterator1,
typename Iterator2>
210NEFORCE_CONSTEXPR20 Iterator2
partial_sum(Iterator1 first, Iterator1 last, Iterator2 result) {
224template <
typename Iterator,
typename T>
225NEFORCE_CONSTEXPR20
void sequence_fill(Iterator first, Iterator last, T value) {
228 while (first != last) {
238NEFORCE_END_NAMESPACE__
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)
内积计算