Pointer von Elementen aus einem vector



  • Kann ich die Referenzen, die ich von einem vector mit der at() Methode bekomme einfach dereferenzieren?
    Ich bekomme leider immer wieder die gleiche Speicherstelle bei verschiedenen Objekten, das kommt mir irgentwie nicht ganz richtig vor.
    Wie kann man sowas am besten bewerkstelligen.
    Ich nutze das in einer for(auto i : vector) schleife, kann es sein, dass ich nur die Adresse des Interators bekomme, wenn ich &i schreibe?



  • Nein, du bekommst die Adresse der lokalen (Schleifen-)Variable.



  • Und wie komme ich an die Adresse der Elemente, wie sie im Vektor gespeichert sind?

    Ich meine eigentlich bekomme ich von so einem Vektor doch Referenzen auf die eigentlichen Objekte. Wenn ich die referenziere, sollte ich doch einen zeiger das originalobjekt im Vektor bekommen, oder nicht?



  • Bengo schrieb:

    Ich meine eigentlich bekomme ich von so einem Vektor doch Referenzen auf die eigentlichen Objekte.

    Ja, aber mit auto i bekommst du eine Kopie, wenn du die Referenz behalten willst, musst du auto& i schreiben.


  • Mod

    Bengo schrieb:

    Ich meine eigentlich bekomme ich von so einem Vektor doch Referenzen auf die eigentlichen Objekte. Wenn ich die referenziere, sollte ich doch einen zeiger das originalobjekt im Vektor bekommen, oder nicht?

    Nein. Bei

    for(auto i: dein_vector)
    

    ist i eben keine Referenz auf die Elemente des vectors, sondern eine lokale Variable, deren Wert bei jedem Schleifendurchgang eine Kopie des jeweils nächsten Elements im vector wird. Über das i kommst du hier also gar nicht an die Adresse der Elemente im vector.

    Es gibt natürlich viele andere Möglichkeiten, eine Schleife über alle Vectorelemente zu schreiben, bei der man problemlos an die Adressen kommt. Was genau am besten ist, hängt davon ab, was du warum genau erreichen möchtest.



  • Kann es sein, das du die Funktion "data()" suchst?



  • SeppJ schrieb:

    Bengo schrieb:

    Ich meine eigentlich bekomme ich von so einem Vektor doch Referenzen auf die eigentlichen Objekte. Wenn ich die referenziere, sollte ich doch einen zeiger das originalobjekt im Vektor bekommen, oder nicht?

    Nein. Bei

    for(auto i: dein_vector)
    

    ist i eben keine Referenz auf die Elemente des vectors, sondern eine lokale Variable, deren Wert bei jedem Schleifendurchgang eine Kopie des jeweils nächsten Elements im vector wird. Über das i kommst du hier also gar nicht an die Adresse der Elemente im vector.

    Es gibt natürlich viele andere Möglichkeiten, eine Schleife über alle Vectorelemente zu schreiben, bei der man problemlos an die Adressen kommt. Was genau am besten ist, hängt davon ab, was du warum genau erreichen möchtest.

    Wie könnte den so eine Schleife aussehen?

    for(int i = 0; i < vector.size(); ++i) {
    &vector.at[i]; 
    }
    

    funktionert leider auch nicht

    bzw es funktionert schon, aber ich kann diese Adressen nicht in einem weiteren Vector speichern, weil die const sind, aber push_back keine const Wert will.

    ElementWrapper.cpp:38:40: error: invalid conversion from ‘const EW* {aka const ElementWrapper*}’ to ‘std::vector<ElementWrapper*>::value_type {aka ElementWrapper*}’ [-fpermissive]
    links.push_back(adresse);



  • Sollte aber funktionieren.
    Oder eben for(auto& i : container)



  • Ja ich musste meinen vector der Zeiter als vector<const EW*> deklarieren, dann hat es funktionert.

    Heißt das eigentlich, dass ich die zeiger selbst nicht mehr ändern kann, oder dass ich auch durch diese Zeiger nichts mehr ändern kann?



  • Nehmen wir mal den Ausdruck 'const int*' ausseinander oder besser, weil logischer, der gleichbedeutende 'int const *'. Das const kann vor oder hinter dem Typ stehen.:
    int -> es handelt sich um einen Integer
    const -> ..einen konstanten Integer
    * -> ...einen Zeiger auf einen konstanten Integer.

    So kannst du auch komplexere Ausdrücke erkennen, wie z.b. 'const int *const *&const':
    'const int' bzw 'int const' -> ein konstanter integer
    * -> ...ein zeiger auf einen konstanten integer
    const -> ein konstanter zeiger auf einen konstanten integer
    * -> ein zeiger auf einen konstanter zeiger auf einen konstanten integer
    & -> eine referenz auf einen zeiger auf einen konstanter zeiger auf einen konstanten integer
    const -> eine konstante referenz auf einen zeiger auf einen ein konstanter zeiger auf einen konstanten integer

    ...und so weiter 😉


  • Mod

    Ich möchte noch einmal meine subtile Frage im letzten Beitrag wiederholen, dieses mal etwas weniger subtil: Was soll das werden, wenn es fertig ist? Was genau willst du warum erreichen?

    Momentan sieht es sehr danach aus, als würdest du eine komplizierte Lösung für ein sehr einfaches (oder gar bereits in der Standardbibliothek gelöstes) Problem konstruieren. Da du aber nur danach fragst, was du denkst, was dir auf dem Weg helfen könnte (und nicht, was der richtige Weg wäre), kann man dir nicht optimal helfen.


Log in to reply