Методы stl с функциями cmath - PullRequest
4 голосов
/ 04 августа 2010

Я пытался написать метод STL, чтобы взять журнал вектора:

for_each(vec.begin(),vec.end(),log);

Но я получаю

no matching function for call to ‘for_each(__gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, __gnu_cxx::__normal_iterator<double*, std::vector<double, std::allocator<double> > >, <unresolved overloaded function type>)’

То, что я собираю, связано с несколькими версиями функции журнала. Очевидно, я могу написать простую обертку вокруг функции log и вызвать ее с этим. Есть ли более простой способ указать, какую функцию журнала я хочу встроить?

Ответы [ 2 ]

8 голосов
/ 04 августа 2010

Да. Вы можете привести функцию к соответствующему типу:

for_each(vec.begin(),vec.end(),(double(*)(double))log);

Другой возможностью было бы создание вашего функтора, который бы принимал любой тип:

struct log_f
{
  template <class T> T operator()(const T& t) const { return log(t); }
};

for_each(vec.begin(),vec.end(), log_f());

И, как указал Билли О'Нил, вы хотите скорее transform, чем for_each.

2 голосов
/ 04 августа 2010

Я думаю, std::for_each ищет функцию с возвращаемым типом void.Вы передаете функцию с двойным типом возврата. Ответ jpalecek является правильным, и +1 ему.Однако у вас все еще есть семантическая проблема, что выполнение for_each с журналом не имеет никакого смысла:

Если вы хотите, чтобы все элементы вектора были журналом предыдущих элементов, то есть:

//pseudocode
foreach( var x in myvector )
   x = log(x);

Тогда вам не нужно for_each, вам нужно transform.

std::transform(vec.begin(), vec.end(), vec.begin(), log);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...