【问题标题】:c++ accumulate how to apply specific function to last elementc ++累积如何将特定功能应用于最后一个元素
【发布时间】:2015-08-20 01:45:15
【问题描述】:

我有一个关于 std::accumulate 的问题。

通常,accumulate 将采用 std::vector<U> vectT 类型的种子,并将(左)折叠函数 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 的一个特例。

谢谢

【问题讨论】:

  • 您的版本对我来说似乎很自然(假设vect 不为空)。
  • 我什至会说其他任何事情都不太清楚。
  • "并将(左)折叠函数fTxU->U ..."。要么你的大脑被 Haskel 损坏了,要么我的被 C++ 损坏了。我无法决定哪个,所以它可能是我的。
  • 我去 Haskell Anonymous...

标签: c++ stl stl-algorithm


【解决方案1】:

根据答案:

实现清晰自然。向量必须非空。

【讨论】:

  • “避免分段错误”对于任何事情来说都是一种奇怪而可怕的动机。你编程是因为你想实现某个目标,而不是因为你想避免犯错。向量必须是非空的,因为非空是既定目标的要求!
【解决方案2】:

您的实现很好,但是您可以使用仿函数来实现您所需要的,

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()));

我不确定这是否有效,但它看起来并不好

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-20
    • 2018-01-26
    • 1970-01-01
    • 2014-11-13
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多