STL-Container aus STL-Containern - dynamische Größe - wie erzeugen ?



  • Hi
    Sinngemäß folgendes Problem (evtl. Syntaxfehler bitte mal ignorieren)...

    std::vector< std::deque<unsigned long> > m_dequeVector;
    std::deque<unsigned long> m_deque;
    int amount << cin;
    

    Ich möchte jetzt "amount" viele deques in m_dequeVector packen.

    Wie mache ich das ? "amount" steht ja erst zur Laufzeit fest und ich kann daher nicht einfach m_deque1, m_deque2 etc fest einprogrammieren...

    Danke euch !

    Viele Grüße,
    Benjamin



  • EDIT:

    Mit resize

    MfG

    GPC



  • Entweder mit ner for-Schleife.
    Oder eben erst anlegen, wenn das Ding wirklich gebraucht wird:

    int amount << cin;
    std::vector< std::deque<unsigned long> > m_dequeVector(amount);
    

    Das legt einen vector mit amount deques an.
    Willst Du die angelegten deques vorher mit einem default-Inhalt befüllen dann so:

    int amount << cin;
    
    std::deque<unsigned long> m_deque;
    // m_deque mit default-Werten befüllen
    
    std::vector< std::deque<unsigned long> > m_dequeVector(m_deque, amount);
    

    Merke: Objekte immer erst dann anlegen, wenn Du sie sinnvoll initialisieren kannst.



  • Für solche Zwecke können die STL-Container zur Laufzeit angepasst werden - un Zugriff auf ihre Elemente bieten:

    vector<deque<int> > data;
    int size;cin>>size;
    data.resize(size);//verschafft dir Platz für "size" deques
    for(int i=0;i<size;++i)
    {
      data[i].resize(...);//Zugriff auf die i-te deque im Vektor
      ...
    }
    


  • @GPC: reserve() sagt dem Vektor nur, daß du ihn eventuell später auf diese Größe aufpusten willst - um Elemente anzulegen, nimmst du resize().



  • Danke.

    Ich hatte mein Problem nicht sauber formulliert. Wie ich die Größe des Vectors festsetzen kann ist klar (zumal er sich automatisch resized).

    Mein Problem war eher, wie ich da verschiedene Objekte vom Typ Deque reinkriege, die ich auch einzeln ansprechen kann.
    Wenns feststehen würde, hätte ich einfach
    m_deque1, mdeque2, ... erzeugt und die jeweils an sie i-te STelle im Vector gepackt.

    Aber dashier scheint ja obiges zu erfüllen.

    int amount << cin;
    
    std::deque<unsigned long> m_deque;
    // m_deque mit default-Werten befüllen
    
    std::vector< std::deque<unsigned long> > m_dequeVector(m_deque, amount);
    

    Dankeschön !



  • Benja_m schrieb:

    Mein Problem war eher, wie ich da verschiedene Objekte vom Typ Deque reinkriege, die ich auch einzeln ansprechen kann.

    Wie ich oben schon sagte: Nimm eine Schleife und bearbeite sie nacheinander 😉 (oder verwende den Index-Operator des Vector's, um seine Elemente (die einzelnen Deque's) anzusprechen)



  • Kleines Problem noch:

    Header-Datei:

    std::vector< std::deque<unsigned long> > m_dequeVector;
    std::deque<unsigned long> m_deque;
    

    cpp-Datei:

    int amount; 
    amount << cin;
    // m_deque initialisieren
    m_deque.push_back(0);
    
    // m_dequeVector initialisieren
    
    for (int i = 0; i < amount; i++) {
        m_dequeVector.push_back(m_deque);
    }
    

    Ich habs nicht ausprobiert, aber habe ich dann nicht "amount"-Mal dieselbe Deque (das identische Objekt ...) im Vector ? Das wäre in meinem Fall kontraproduktiv 🙂

    Oder wiemache ich das sonst in einer for-Schleife *verwirrt*



  • push_back() kopiert das Element, das du dort übergibst - also hast du am Ende der for()-Schleife ammount Kopien deines Deque im Vector, die du auch unabhängig voneinander weiterverarbeiten kannst.

    (eine andere Variante kannst du in meinem ersten Beitrag in diesem Thema bewundern)



  • Ok, wenn push_back Kopien erzeugt reicht mir das und die Welt ist in Ordnung 🙂

    Vielen Dank !


Log in to reply