2016-06-29 5 views
1

Ich versuche, eine ungeordnete Karte zu verwenden, um rollende Akkumulatoren in einer Klasse zu halten.Verwenden von rollenden Akkumulatoren in ungeordneten Karten in einer Klasse

Lassen Sie mich zuerst zeigen, was funktioniert. Hier ist ein Akkumulator innerhalb einer Klasse, der ohne die Karte wie erwartet funktioniert. Beachten Sie, dass der Akkumulator in der Initialisierungsliste initialisiert werden muss.

#include <iostream> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics/stats.hpp> 
#include <boost/accumulators/statistics/rolling_mean.hpp> 

namespace nmbstacc = boost::accumulators; 
typedef nmbstacc::accumulator_set<double, nmbstacc::stats<nmbstacc::tag::rolling_mean >> MACC; 

class RollMean { 

public: 
    MACC m_acc; 
    RollMean(void) : m_acc(nmbstacc::tag::rolling_window::window_size = 3) {} 
}; 

int main() 
{ 
    RollMean obj; 
    obj.m_acc(0.5); 
    obj.m_acc(1.5); 
    obj.m_acc(2.5); 
    obj.m_acc(3.5); 

    std::cout << "roll_mean: " << nmbstacc::rolling_mean(obj.m_acc) << std::endl; 

    std::getchar(); 
    return 0; 
} 

Aber was ich brauche, ist eine ungeordnete Karte dieser Akkumulatoren in einer Klasse zu halten, kann aber scheint nicht, um herauszufinden, wie das folgende Programm zu kompilieren. Ich bin mir nicht sicher, wie man den mainmap-Container deklariert, ohne zuerst den rollenden Akkumulator zu initialisieren.

#include <iostream> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics/stats.hpp> 
#include <boost/accumulators/statistics/rolling_mean.hpp> 
#include <unordered_map> 

namespace nmbstacc = boost::accumulators; 
typedef nmbstacc::accumulator_set<double, nmbstacc::stats<nmbstacc::tag::rolling_mean >> MACC; 

class RollMean { 

public: 
    MACC m_acc; 
    std::unordered_map<std::string, MACC> mainmap; 
    RollMean(std::string name) : m_acc(nmbstacc::tag::rolling_window::window_size = 3) { 
     mainmap.emplace(name, m_acc); 
    } 
}; 

int main() 
{ 
    RollMean obj("a"); 
    obj.mainmap["a"](1.0); 

    std::cout << "roll_mean: " << nmbstacc::rolling_mean(obj.mainmap["a"]) << std::endl; 

    std::getchar(); 
    return 0; 
} 

bekomme ich folgende Fehlermeldung:

Fehler C2679 binäre ‚[‘: kein Betreiber gefunden, der einen rechten Operanden vom Typ nimmt ‚boost :: Parameter :: Keyword‘ (oder gibt es keine akzeptable Umwandlung)

Danke.

+1

Was würde passieren, wenn Sie 'obj.mainmap schreiben waren [ "non_existing_key"]'? – llonesmiz

Antwort

2

Wie @jv_ hinged ist map[key] eine Mutationsoperation, die ein standardmäßig erstelltes Element einfügt, wenn keines existiert.

Es gibt jedoch keinen Standardkonstruktor für Ihren Elementtyp. Daher können Sie diesen Operator nicht verwenden.

Wenn Sie obj.mainmap.at("a") anstelle von obj.mainmap["a"] verwenden, erhalten Sie stattdessen eine Ausnahme für fehlende Schlüssel.

Live On Coliru

#include <iostream> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics/stats.hpp> 
#include <boost/accumulators/statistics/rolling_mean.hpp> 
#include <unordered_map> 

namespace nmbstacc = boost::accumulators; 
typedef nmbstacc::accumulator_set<double, nmbstacc::stats<nmbstacc::tag::rolling_mean> > MACC; 

class RollMean { 

    public: 
    MACC m_acc; 
    std::unordered_map<std::string, MACC> mainmap; 
    RollMean(std::string name) : m_acc(nmbstacc::tag::rolling_window::window_size = 3) { mainmap.emplace(name, m_acc); } 
}; 

int main() { 
    RollMean obj("a"); 
    obj.mainmap.at("a")(1.0); 

    std::cout << "roll_mean: " << nmbstacc::rolling_mean(obj.mainmap.at("a")) << std::endl; 
} 

Drucke:

roll_mean: 1 
Verwandte Themen