Das folgende Stück Code produziert eine sehr seltsame Ausgabe und ich habe keine Ahnung warum. Es soll ein sehr primitiver Maßstab für meine anderen Testprogramme sein. Welche ausführbare Datei als cmd-Zeilenparameter übergeben wird, wird ein paar Mal ausgeführt, und die Taktzyklen werden gezählt. Dann werden mean und stddev berechnet (nun, noch nicht vollständig implementiert, aber Sie erhalten die Idee).Std :: For_Each mit Funktionsobjekt
#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;
}
Was mir ein Rätsel ist, dass srs.getSrs() gibt immer was Wert SRS zugeordnet :: srs durch die c'tor (die 0.0 ist hier). Entweder std :: for_each wird ausgewertet, nachdem die Ausgabe für die Streams erstellt wurde oder std :: for_each kehrt das Funktionsobjekt nach der Ausführung in seinen früheren Status zurück.
'std :: for_each', wie die meisten (alle?) Algorithmen in der Standardbibliothek, akzeptiert Funktionsobjekte * von Wert *. –
FYI Ihr 'operator()' ist definiert als Rückgabe eines 'double', aber Sie geben nichts zurück. Das 'for_each' sollte es nicht benutzen, aber es ist immer noch UB. – Kevin