2017-07-24 5 views
1

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.

+0

'std :: for_each', wie die meisten (alle?) Algorithmen in der Standardbibliothek, akzeptiert Funktionsobjekte * von Wert *. –

+1

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

Antwort

7

Der Prädikatparameter std::for_each ist ein Wert, dh der Algorithmus verwendet eine Kopie des als Argument übergebenen Funktors. Wenn Sie seinen Zustand untersuchen möchten, können Sie die Kopie zurück zu Ihnen:

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

Das ist seltsam, ich habe nie realisiert, dass "for_each" etwas zurückgegeben hat. – 0x499602D2

Verwandte Themen