Boost Spirit, std::vector, Vectorgroesse vor dem parsen resize festlegen ?



  • Hallo Leute,

    ich habe einen Parser mit Boost Spirit geschrieben, der Parser muss viele Daten parsen. Ich habe mehrer qi:rule's mit std::vector:

    qi::rule<Iterator, std::vector<std::string> > data;
    

    Gibt es eine moeglichkeit die Groesse des vectors mit der Memberfunktion "resize" vor dem parsen zu veraendern. Ich weiss das waehrend des Parsens der vector mehrmals vergroessert wird, das umkopieren wuerde ich gerne vermeiden.
    Wie kann man die vector Groesse festlegen?

    Besten Dank
    🙂



  • Wenn ich Dich richtig verstehe, möchtest Du eine Reallokation des Vektors vermeiden.
    Dazu benutzt Du vector::reserve() .



  • Ja genau, eine Reallokation vermeiden.
    Aber wie wird das gemacht wenn ich nur die qi rules benutze, ich habe ja keinen dirketen Zugriff auf den vector.

    qi::rule<Iterator, std::vector<std::string> > data;
    


  • eventuell so?:

    struct Test: public std::vector<std::string> 
    {
    	Test() { reserve(41); }
    };
    

    Keine Ahnung, ob das wirklich was bringt. Eigentlich wollte ich die Vererbung private machen. Aber dann macht Spirit irgendwie Probleme.



  • Schreibe eine Grammatik. Die kannst du wie eine Regel verwenden und kannst auch machen, was du möchtest.

    EDIT: Ist, je nach dem wie komplex deine Parser sind, vielleicht ohnehin sinnvoll.


Anmelden zum Antworten