std::vector aus std::queue's



  • Hallo zusammen, ich versuche gerade ein Template zu erzeugen, das ein Vektor aus Queue's erzeugt. Also zunächst die Klasse:

    class Node {
        
        public:
        
        //Node(T, int anz = 5) : BasePtr(T, anz) {
        Node(T myType, int anz = 5) {
    
            this->elementCnt = 5;
            std::queue<T> q;
            q.push(myType);
            Base.push_back(q);
            //Base.push_back(std::queue<T> q.push(myType));
            
        }
    
        private:
        int         elementCnt;
        std::vector<std::queue<T>> Base;
    
    };
    

    Und ich erzeuge dann 2 verschiedene Instanzen für verschiedene Datentypen (stark vereinfacht um das Problem hervorzustellen:

    int main(int argc, char *argv[])
    {
        int n = 5;
    
        Node<const char*> v("hallo",n);
        Node<int> d(7,n);
    
        return 0;
    }
    

    Das funktioniert auch. Ich frage mich nur, ob man das auch etwas einfacher haben kann, nämlich ohne das temporäre std::queue Objekt im Konstruktor. So das man direkt in den Vektor eine anonyme Queue einfügen kann? Das könnt so aussehen:

    Base.push_back(std::queue<T> q.push(myType));
    

    funktioniert so aber nicht. Aber wie könnte man das machen?
    Vielen Dank


  • Mod

    Base.push_back(std::queue<T>({myType}));
    

    Aber wenn wir schon so weit sind, die Queue mit einer initializer list zu füttern, können wir auch ganz diese temporäre, namenlose Queue vermeiden:

    #include <initializer_list>
    
    [...]
    
    Base.emplace_back(std::initializer_list<T>{myType});
    

    All das (inklusive deiner jetzigen Variante) sollte für einen optimierenden Compiler aber leicht durchschaubar sein und dürfte zum selben Maschinencode führen. Es ist daher eigentlich nur ein Unterschied welche Variante zu am verständlichsten zu Lesen findest. Rein theoretisch enthält die letzte Variante aber die kleinste Anzahl an Schritten und Objekten, auch wenn sie von der Anzahl der Zeichen her die längste ist.



  • @SeppJ sagte in std::vector aus std::queue's:

    #include <initializer_list>

    Vielen Dank, genau nach sowas habe ich gesucht. C++ denkt wirklich an alles 😉
    Ich habe noch diesen Blog Eintrag gefunden: push_back vs. emplace_back


Anmelden zum Antworten