2016-11-16 2 views
3

Как это реализовать с помощью std::transform и std::foreach? (без C++ 11)Экспоненциальный вектор с использованием std :: transform

std::vector<double> exp_c(const std::vector<double>& x) { 
    const int n = x.size(); 
    std::vector<double> y(n); 
    for (int i = 0; i < n; i++) { 
    y[i] = std::exp(x[i]); 
    } 
    return y; 
} 

Спасибо.

+2

относящийся: http://stackoverflow.com/questions/356950/c-functors-and-their-uses – NathanOliver

ответ

3

Использование std::transform это будет выглядеть следующим образом:

struct op { double operator() (double d) const { return std::exp(d); } }; 
std::vector<double> exp_c(const std::vector<double>& x) { 
    const int n = x.size(); 
    std::vector<double> y(n); 
    std::transform(x.begin(), x.end(), y.begin(), op()); 
    return y; 
} 

на самом деле это почти точно, что C++ 11 компилятор будет создавать, когда вы будете использовать лямбда.

1

Немного некрасиво решение:

std::vector<double> exp_c(const std::vector<double>& x) 
{ 
    std::vector<double> y; 
    y.reserve(x.size()); 
    std::transform(x.begin(), x.end(), std::back_inserter(y), 
        static_cast<double(*)(double)>(std::exp)); 
    return y; 
} 

static_cast необходимо сообщить компилятору, который перегрузка std::exp перейти к std::transform.

Смежные вопросы