2016-07-17 7 views
0

Ich habe bereits einen Vektor von Listen und 3 Listen deklariert und diese 3 Listen im Vektor hinzugefügt. Jetzt möchte ich einige Elemente zu 2 aus diesen 3 Listen hinzufügen, indem Sie den Vektor nur verwenden. Wie kann ich das erreichen?
Hier ist mein Code so weit:Element in einzelne/mehrere Listen in einem Vektor der Liste hinzufügen

#include<iostream> 
#include<list> 
#include<vector> 
using namespace std; 


#ifndef ILIST 
#define ILIST list<int> 
#endif 

#ifndef VLIST 
#define VLIST vector<ILIST > 
#endif 

int main(int argc, char const *argv[]) 
{ 
    ILIST l1(4,10), l2(4,20), l3(4,30); 
    VLIST vec; 
    vec.push_back(l1); 
    vec.push_back(l2); 
    vec.push_back(l3); 
    //here I want to add 2 elements in l2 and 1 in l3 by using the vector only. 
    return 0; 
} 
+0

Warum schreiben Sie 3 Codezeilen, um einen Typalias zu definieren, anstatt ILIST = std :: list ; '? – kfsone

+0

Auch 'vec.push_back (x)' erstellt eine neue Kopie von 'x' auf der Rückseite von' vec', also müssen Sie ändern, was 'vec' speichert, um ein Zeiger oder ein' std :: reference_wrapper zu sein '. – kfsone

+0

@kfsone Ich kannte den ersten Ansatz nicht, ich kenne noch nicht alle Konzepte von C/CPP. Hier vor kurzem aus der schlechten Performance von Java eingezogen. Ich denke, dein zweiter Kommentar enthält meine Antwort, richtig? –

Antwort

2

Ein kurzer Einblick in das, was Ihre aktuellen Code tut:

ILIST l1(4,10), l2(4,20), l3(4,30); 

Drei lokale Variablen.

VLIST vec; 

Ein lokaler Vektor.

vec.push_back(l1); 

Der Vektor weist nun einige dynamischen Speicher mindestens einen iList zu speichern, und dann Kopien der Inhalt der l1 in diesen Speicher. Die beiden sind jetzt unabhängig.

Wenn Sie einen Vektor haben wollen, die im Wesentlichen eine Ansicht ist, dass Sie die Zielobjekte durch sie manipulieren, werden Sie einen Zeiger oder eine Referenz in Ihrem Vektor speichern müssen:

#include <iostream> 
#include <list> 
#include <vector> 

using ilist_t = std::list<int>; 
using vecilist_t = std::vector<ilist_t*>; 

int main() 
{ 
    ilist_t il; // empty list 
    vecilist_t vec; // empty vector 

    vec.push_back(&il); // store address in vec[0] 

    vec[0]->push_back(42); // vec[0] has type `ilist_t*`, -> dereferences 

    for (int i : il) { 
     std::cout << i << '\n'; 
    } 
} 

wie Sie angegeben haben Sie ein Lerner sind, werde ich, dass wie dies mit rohen Zeiger weisen darauf hin, es ist bis zu Ihnen, um sicherzustellen, dass die Objekte länger durch den Vektor als ihre mögliche Verwendung beharren darauf:

vecilist_t f() { 
    ilist_t i; 
    vecilist_t v; 
    v.push_back(&i); 
    return v; 
} 

int main() { 
    auto v = f(); 
    v[0]->push_back(42); // undefined behavior, probably crash 
} 

Der Vektor wurde von f zurückgegeben hat die Adresse i, die automatische Speicherdauer hat - ihre Lebensdauer endet am Ende des Funktionsumfangs, wodurch der Zeiger auf sie in unserem zurückgegebenen Objekt ungültig wird und Undefined Behavior folgen würde.

--- EDIT ---

Es ist nicht klar, warum Sie die freistehenden Listen müssen. Wenn alles, was Sie wollen ein Vektor von 3 Listen ist, können Sie folgendes tun:

#include <vector> 
#include <list> 

using ilist_t = std::list<int>; 
using ilvec_t = std::vector<ilist_t>; 

int main() { 
    ilvec_t ilvec; 
    ilvec.resize(3); // now contains 3 empty lists. 

    // push a value onto the 2nd list 
    ilvec[1].push_back(42); 
} 

Wenn Ihr Vektor einen Compiler-feste Größe haben wird, können Sie std :: Array stattdessen verwenden.

+0

'für (int i: il) { std :: cout << i << '\ n'; } 'Ich möchte in der Lage sein, die Elemente einer Liste mit dem Vektorobjekt und nicht mit der Liste selbst zu durchlaufen. –

+0

Nevermind, ich habe es herausgefunden. Der zweite Teil des Codes, können Sie mir bitte etwas vorschlagen, um dieses Problem zu überwinden? –

+0

@AkashAggarwal Ich versuche zu verstehen, ob Sie die freistehenden Listen überhaupt benötigen oder ob Sie nur einen Vektor von Listen benötigen. Um ein Element über den Vektor zu "l2" hinzuzufügen, verwenden Sie 'vec [1] -> push_back (value);'. Meinst du das mit dem zweiten Teil des Codes? – kfsone