2015-06-05 2 views
4

У меня есть вопрос относительно std :: accumulate.C++ накапливает способ применения конкретной функции к последнему элементу

Как правило, накапливают займет std::vector<U> vect, семя типа T и (слева) сложите функцию fTxU->U для этого диапазона:

T result = accumulate(vect.begin(), vect.end(), seed, f); 

Есть естественный способ применения конкретной версии f для последнего элемента? Это для PDE, у меня есть особое условие для последнего шага.

Мы можем сделать что-то вроде:

T result1 = accumulate(vect.begin(), vect.end()-1, seed, f1); 
T result2 = f2(result1, vect.back()); 

Но мне интересно, если есть более естественный путь, так как f2 на самом деле является частным случаем f1.

Благодаря

+3

Ваша версия кажется естественной для меня (если 'vect' не пуст). – Jarod42

+0

Я бы даже сказал, что все остальное будет менее ясным. – TartanLlama

+0

"и (влево) свернуть функцию' f' 'TxU-> U' ...". Либо ваш мозг был поврежден Haskel или моим C++. Я не могу решить, что, возможно, это мое. – nwp

ответ

0

Ваша реализация в порядке, но вы можете добиться того, что вам нужно с функтора,

class myFunctor{ 
    int size_of_vector; 
    int nbCalls; 
    myFunctor(int size) : size_of_vector(size), nbCalls(0){} 
    ... operator()(...) { 
    if((nbCalls++)==size_of_vector) 
     // call special function 
    else 
     // call f 
    } 
}; 

, а затем использовать его как это:

T result1 = accumulate(vect.begin(), vect.end(), seed, myFunction(vect.size())); 

Я не уверен, если это работает, но в любом случае оно не выглядит хорошо

0

Основано на ответах:

Реализация понятна и естественна. Вектор должен быть непустым.

+0

«Во избежание ошибки сегментации» - это странная и страшная мотивация для чего угодно. Вы программируете, потому что хотите * достичь * определенной цели, а не потому, что хотите * избежать * страдания от ошибки. Вектор должен быть непустым, потому что неэмпичность является требованием указанной цели! –

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