C++ c++;累积如何将特定函数应用于最后一个元素

C++ c++;累积如何将特定函数应用于最后一个元素,c++,stl,stl-algorithm,C++,Stl,Stl Algorithm,我有一个关于性病的问题 通常,累积将采用std::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 resul

我有一个关于性病的问题

通常,累积将采用
std::vect
,类型为
T
的种子,并将(左)折叠该范围内的函数
f
TxU->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的特例


谢谢

您的实现很好,但您可以使用函子实现所需的功能

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()));
我不确定这是否有效,但不管怎样,它看起来并不好

根据答案:


执行是明确和自然的。向量必须是非空的。

你的版本对我来说似乎很自然(假设
vect
不是空的)。我甚至会说其他任何东西都不那么清晰。“并且将(左)折叠函数
f
TxU->U
。”。或者你的大脑已经被哈斯克尔或我的C++所破坏。我不能决定哪一个,所以它可能是我的。我去Haskell Anonymous…“避免分割错误”是一个奇怪和可怕的动机。你编程是因为你想达到某个目标,而不是因为你想避免犯错误。向量必须是非空的,因为非emtpiness是所述目标的要求!