c++ - 带有函数对象的 std::for_each

标签 c++ algorithm

下面的一段代码产生了一个非常奇怪的输出,我不知道为什么。 它应该是我其他测试程序的一个非常原始的基准。无论作为 cmd 行参数传递的可执行文件都会执行几次并计算时钟周期,然后计算 mean 和 stddev(好吧,还没有完全实现,但你明白了)。

#include <algorithm>
#include <cmath>
#include <ctime>
#include <iostream>
#include <numeric>
#include <vector>

class SRS{
public:
  SRS(double p1):mean(p1), srs(0.0){std::cout << this->mean << std::endl;} //DEBUG
  double operator()(unsigned p1){
    this->srs += std::pow(this->mean - (double)p1, 2.0);
    std::cout << p1 << "    " << this->srs << std::endl; //DEBUG
  }
  double getSrs(){
    return this->srs;
  }
private:
  double mean;
  double srs;
};

int main(int argc, char* argv[]){
  unsigned nCyc;
  if(argc<3){nCyc=1000;}else{nCyc=std::stoi(argv[2]);}
  std::vector<clock_t> c{};
  for(unsigned u = 0; u<nCyc; u+=1){
    clock_t t = clock();
    system(argv[1]); //this is stupid and dangerous
    t = clock() - t;
    c.push_back(t);
  }
  clock_t clkSum = std::accumulate(c.begin(), c.end(), 0);
  double clkMean = (double)clkSum / (double)nCyc;
  SRS srs(clkMean);
  std::for_each(c.begin(), c.end(), srs);
  std::cout << "The program ran for " << clkMean << " +/- " << srs.getSrs() << " clock cycles" << std::endl;

  return 0;
}

令我困惑的是 srs.getSrs() 总是返回 c'tor 分配给 SRS::srs 的任何值(这里是 0.0)。 在创建流的输出后评估 std::for_each 还是在执行后 std::for_each 将函数对象恢复到以前的状态?

最佳答案

std::for_each的谓词参数是一个值,这意味着该算法使用作为参数传递的仿函数的拷贝。如果你想检查它的状态,你可以使用返回给你的拷贝:

SRS ret = std::for_each(c.begin(), c.end(), srs);
std::cout << "The program ran for " << clkMean 
          << " +/- " << ret.getSrs() << " clock cycles" << std::endl;

关于c++ - 带有函数对象的 std::for_each,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45289098/

相关文章:

algorithm - 不同步长的Floyd环路检测算法

algorithm - 动态规划斐波那契算法

C++列表遍历和初始化

c++ - 以编程方式生成可以导入 blender 的 3D 模型

c++ - 有一个更好的方法吗?

c++ - 如何将可变长度字符串从 RPC 服务器传递到客户端?

c++ - 在 C++17 中初始化整数 vector 的 vector

python - 使用编程和/或数学计算比较次数并分析特定算法的效率

algorithm - n 楼梯/台阶攀爬问题 : cannot conceptualize why T(n) = T(n-1) + T(n-2)

c++ - 抄袭检测-风选算法-指纹冲突