std:: transform_exclusive_scan
|
Определено в заголовке
<numeric>
|
||
|
template
<
class
InputIt,
class
OutputIt,
class
T,
class
BinaryOp,
class
UnaryOp
>
|
(1) |
(начиная с C++17)
(constexpr начиная с C++20) |
|
template
<
class
ExecutionPolicy,
class
ForwardIt1,
class
ForwardIt2,
class
T,
|
(2) | (начиная с C++17) |
[
0
,
std::
distance
(
first, last
)
)
, выполняет следующие операции по порядку:
-
Создаёт последовательность, состоящую из
init
, за которым следуют значения, преобразованные из элементов
[first,iter)в порядке их следования с помощью unary_op , где iter является следующим i -м итератором first . - Вычисляет обобщённую некоммутативную сумму последовательности с помощью binary_op .
- Присваивает результат * dest , где dest является следующим i -м итератором d_first .
|
std:: is_execution_policy_v < std:: decay_t < ExecutionPolicy >> равно true . |
(до C++20) |
|
std:: is_execution_policy_v < std:: remove_cvref_t < ExecutionPolicy >> равно true . |
(начиная с C++20) |
Обобщённая некоммутативная сумма последовательности элементов над бинарной операцией binary_op определяется следующим образом:
- Если последовательность содержит только один элемент, сумма равна значению этого элемента.
- В противном случае выполняет следующие операции в указанном порядке:
- Выбирает любые два соседних элемента elem1 и elem2 из последовательности.
- Вычисляет binary_op ( elem1, elem2 ) и заменяет два элемента в последовательности полученным результатом.
- Повторяет шаги 1 и 2 до тех пор, пока в последовательности не останется только один элемент.
Результат недетерминирован, если
binary_op
не является ассоциативной операцией (например, сложение чисел с плавающей точкой).
Если любое из следующих значений не может быть преобразовано в
T
, программа является некорректной:
- binary_op ( init, init )
- binary_op ( init, unary_op ( * first ) )
- binary_op ( unary_op ( * first ) , unary_op ( * first ) )
Если выполняется любое из следующих условий, поведение не определено:
-
Tне является MoveConstructible . -
unary_op
или
binary_op
изменяет любой элемент диапазона
[first,last). -
unary_op
или
binary_op
инвалидирует любой итератор или поддиапазон
[first,last].
Содержание |
Параметры
| first, last | - | пара итераторов, определяющих диапазон элементов для суммирования |
| d_first | - | начало целевого диапазона, может быть равно first |
| policy | - | политика выполнения для использования |
| init | - | начальное значение |
| unary_op | - | унарный FunctionObject , который будет применен к каждому элементу входного диапазона. Тип возвращаемого значения должен быть допустимым для ввода в binary_op . |
| binary_op | - | бинарный FunctionObject , который будет применен к результату unary_op , результатам других binary_op и init . |
| Требования к типам | ||
-
InputIt
должен удовлетворять требованиям
LegacyInputIterator
.
|
||
-
OutputIt
должен удовлетворять требованиям
LegacyOutputIterator
.
|
||
-
ForwardIt1, ForwardIt2
должен удовлетворять требованиям
LegacyForwardIterator
.
|
||
Возвращаемое значение
Итератор на элемент, следующий за последним записанным элементом.
Сложность
Дано N как std:: distance ( first, last ) :
Исключения
Перегрузка с параметром шаблона с именем
ExecutionPolicy
сообщает об ошибках следующим образом:
-
Если выполнение функции, вызванной как часть алгоритма, выбрасывает исключение и
ExecutionPolicyявляется одним из стандартных политик , std::terminate вызывается. Для любой другойExecutionPolicyповедение определяется реализацией. - Если алгоритму не удается выделить память, std::bad_alloc выбрасывается.
Примечания
unary_op никогда не применяется к init .
Пример
#include <functional> #include <iostream> #include <iterator> #include <numeric> #include <vector> int main() { std::vector data{3, 1, 4, 1, 5, 9, 2, 6}; auto times_10 = [](int x) { return x * 10; }; std::cout << "10 times exclusive sum: "; std::transform_exclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), 0, std::plus<int>{}, times_10); std::cout << "\n10 times inclusive sum: "; std::transform_inclusive_scan(data.begin(), data.end(), std::ostream_iterator<int>(std::cout, " "), std::plus<int>{}, times_10); std::cout << '\n'; }
Вывод:
10 times exclusive sum: 0 30 40 80 90 140 230 250 10 times inclusive sum: 30 40 80 90 140 230 250 310
Смотрите также
|
вычисляет частичную сумму элементов диапазона
(шаблон функции) |
|
|
(C++17)
|
аналогично
std::partial_sum
, исключает
i
й
входной элемент из
i
й
суммы
(шаблон функции) |
|
(C++17)
|
применяет вызываемый объект, затем вычисляет инклюзивное сканирование
(шаблон функции) |