Spec-Zone.ru › C++

std::valarray<T>::apply

valarray<T> apply( T func(T) ) const;
valarray<T> apply( T func(const T&) ) const;

Возвращает новый valarray того же размера со значениями, полученными применением функции func к предыдущим значениям элементов.

Параметры

func - функция, применяемая к значениям

Возвращаемое значение

Результирующий valarray со значениями, полученными применением функции func.

Примечания

Функция может быть реализована с типом возвращаемого значения, отличным от std::valarray. В этом случае замещающий тип обладает следующими свойствами:

  • Предоставляются все const-функции-члены std::valarray.
  • std::valarray, std::slice_array, std::gslice_array, std::mask_array и std::indirect_array могут быть созданы из замещающего типа.
  • Для каждой функции, принимающей аргумент типа conststd::valarray<T>& за исключением begin() и end()(начиная с C++11), должны быть добавлены аналогичные функции, принимающие замещающие типы;
  • Для каждой функции, принимающей два аргумента типа conststd::valarray<T>&, должны быть добавлены аналогичные функции, принимающие все сочетания аргументов типа conststd::valarray<T>& и замещающих типов.
  • Тип возвращаемого значения не должен добавлять более двух уровней вложенности шаблонов относительно типа самого глубоко вложенного аргумента.

Возможная реализация

Приведённые ниже простые реализации можно заменить шаблонами выражений для повышения эффективности.

template<class T>
valarray<T> valarray<T>::apply(T func(T)) const
{
    valarray<T> other = *this;
    for (T& i : other)
        i = func(i);
    return other;
}

template<class T>
valarray<T> valarray<T>::apply(T func(const T&)) const
{
    valarray<T> other = *this;
    for (T& i : other)
        i = func(i);
    return other;
}

Пример

Вычисляет и выводит первые 10 факториалов.

#include <cmath>
#include <iostream>
#include <valarray>

int main()
{
    std::valarray<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    v = v.apply([](int n) -> int
                {
                    return std::round(std::tgamma(n + 1));
                });
    for (auto n : v)
        std::cout << n << ' ';
    std::cout << '\n';
}

Вывод:

1 2 6 24 120 720 5040 40320 362880 3628800

См. также

for_each
применяет унарный объект-функцию к элементам из диапазона
(шаблон функции и объект-функция алгоритма)
ranges::for_each
(C++20)
ranges::for_each
(C++20)
применяет унарный объект-функцию к элементам из диапазона
(объект-функция алгоритма)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/numeric/valarray/apply

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API