Zeiger auf Vector Eintrag ?



  • Hallo Ihr,

    Ich habe ein Problem eventuell komme ich noch mit einem CodeBeispiel was mir gerade zu umständlich erscheint,
    denn ich müsste aus meinen Projekt ein Beispiel abwandeln um es hier darzustellen. Man kann es eventuell auch so nachvollziehen.

    Ich will einen Zeiger auf einen std::vector Eintrag.

    Ich speichere in einem std::vector meinen Datentypen den ich als Struct definiert habe ab.
    Es befinden sich zum Beispiel 50 dieser Datentypen in einem std::vector.

    Nun möchte ich auf bestimmte Struct's zugreifen die sich in der std::vector Liste befinden ohne diese durchlaufen zu müssen.
    Wie kann ich einen Zeiger zum Beispiel auf das 30te Element des std::vector vorher zwischenspeichern um dann später dadrauf zuzugreifen ? Ich möchte keine std::vector Methode für den Zugriff verwenden sondern über den zwischengespeicherten Zeiger auf den jeweiligen Eintrag zugreifen bzw. Struct zugreifen ?

    Ich weiss nicht ob das jemand geschnallt hat ? So schwer ist es nicht zu kapieren.
    Es geht mir hier darum wie ich einen Zeiger auf den Eintrag im Vector zwischenspeichere.



  • Hallo,

    Du könntest dir den Iterator des Elements merken. Beispiel:

    std::vector<double> dvect(20,1.0);
    std::vector<double>::iterator it = dvect.begin() + 5;
    

    Hier wird eine Iterator auf das 6. Element geholt.
    Aber aufgepasst. Der iterator kann ungültig werden. Z. Bsp. bei Operationen die die Größe des vectors verändern (resize, clear, push_back etc.).
    Ein einfacher Zeiger geht ansich auch.

    double* pd = &dvect[5];
    

    Hier gilt das Gleiche wie beim Iterator. Iteratoren sind aber vorzuziehen.



  • mit dem Zeiger, diese Variante gefällt mir, muss ich probieren.

    hatte bei meiner Variante ein Zeiger der auf das Struct selbst zeigt im Struct gespeichert, ich habs aber nicht hinbekommen den Wert auszulesen, Struct war immer leer. War wohl auch völliger Quatsch wenn ich es so im nachhinein betrachte.

    Ich habe ein Vector im Vector und darin dann das Struct, in einer Listview wollte ich den Struct-Zeiger(Item->Data) übergeben was ja auch geht, aber wenn ich drauf zugriff war das Struct leer. Muss ich wohl zu blöd gewesen sein, im Test ohne vector ging es, im vector nicht mehr, ich weiss auch nicht wo der Fehler lag.

    Und nein dieser Vector mit all den Daten darin unterliegt zu diesem Zeitpunkt keiner resize, clear, push_back etc. Ich suche nur eine einfache Möglichkeit an die Daten zu kommen ohne jedesmal schleifen durchlaufen zu müssen um sie wieder zu modifizieren, genau in diesem Fall ist das angebracht.



  • zum Verständniss nochmal,

    alle Daten die ich bearbeite werden durch eine Suche aus dem Vector herausgefiltert, um diese und nur diese gefilterten Daten zu modifizieren brauche ich den Zeiger, dieser erscheint mir als beste Variante. Im Moment arbeitet die ganze Sache mit simplen merken des jeweiligen vector Indizes.



  • Du könntest natürlich auch Zeiger auf deine structs im vector ablegen. Die kann man dann rumreichen. Eine Filterfunktion könnte einen eigenen vector mit den herausgefilterten Elementen zurückgeben.
    Da stellt sich allerdings die Frage wer für das Aufräumen, sprich löschen der Zeiger, zuständig ist. Normalerweise nimmt man im heutigen C++ für sowas smart pointer.
    Ich mache das bei mir aber häufig auch noch mit rohen Zeigern. Wenn man sauber programmiert geht das schon. Ich habe dann meist Manager Klassen welche wieder die vectoren der Zeiger verwalten. Die liefern auch die Filterfunktionen und alles andere was man noch so braucht (zufügen, löschen etc.).



  • so die Sache funktioniert, ich bin begeistert

    DANKE !!!

    nun läuft die Sache zwar in einer Schleife (bedingt durch die letzendliche Zuweisung) aber der Zugriff erfolgt ohne den Vector 🙂 YEAH !!!!

    ((struct KEY_LINE*) mItems->Item[a]->Data)->FileType = mItems->Item[a]->SubItems->Strings[0];
    


  • Danke, daß du nicht mehr Code zeigst. Schützt vor Augenkrebs.



  • ja und was gefällt Dir nicht am Code ?



  • Du Plenkst.
    C-Style Cast.
    Zu viele Pfeilchen.



  • Ich nehm gern ein Beispiel ohne das man Augenkrebs bekommt. Danke.

    Ich weiss es leider nicht besser. Ich programmiere nur gelegentlich.



  • for(int a =0; a < mItems->Count; a++)
    		{
    			mItem = mItems->Item[a];
    			static_cast<struct KEY_LINE*> (mItem->Data)->FileType = mItem->SubItems->Strings[0];
    
    		}
    

    So besser ?



  • das struct kann man ruhig weglassen. Wir machen hier kein C.



  • Swordfish schrieb:

    ...
    Zu viele Pfeilchen.

    Daran ist TE vermutlich schuldlos. Der Großteil der VCL Klassen lassen sich nur auf dem Heap erzeugen und bieten für den Indexzugriff oft noch eine Proxyklasse an, die eine weitere Indirektion erfordern.



  • DocShoe schrieb:

    Swordfish schrieb:

    ...
    Zu viele Pfeilchen.

    Daran ist TE vermutlich schuldlos.

    Es ist trotzdem nicht einfach hier seine Probleme darzulegen ohne das sich jemand in seinem Stolz verletzt fühlt.
    Dafür habe ich sogar Verständniss, jeder hat in dem was er am besten kann seinen Stolz.
    Das Forum hat sich in dieser Hinsicht aber schon sehr verbessert. Es gab schlimmere Zeiten.



  • nutzlos schrieb:

    DocShoe schrieb:

    Swordfish schrieb:

    ...
    Zu viele Pfeilchen.

    Daran ist TE vermutlich schuldlos.

    Es ist trotzdem nicht einfach hier seine Probleme darzulegen ohne das sich jemand in seinem Stolz verletzt fühlt.

    Daran darfst du dich als Anfänger nicht stören.

    Als Profi kann ich dir sagen wieso das so ist:

    Die VCL ist kacke. Heutzutage gnadenlos veraltet (ca. 20 Jahre).
    Aber die war auch schon vor 20 Jahren kacke.
    Alles ist darauf ausgelegt, möglichst einfach zu sein (Form1->Label4 = Form3->Edit13->Text).
    Aber dabei kommt halt nichts gutes raus.

    Leider ist Embarcadero immer noch dabei, Anfängern und nichts-ahnenden Managern, diesen WYSIWYG-Blödsinn als "rapid development" zu verkaufen.
    Was dazu führt das heutzutage immer noch Anfänger versuchen, damit C++ zu lernen (habe ich vor 20 Jahren auch) und dann in diesem Forum landen.

    Und dann müssen die sich eben anhören wie man richtig C++ macht 🙂



  • Naja ich bin schon zufrieden wenn das was ich da programmiere läuft und mir nen haufen Arbeit abnimmt, welche ich niemals auf manuellem weg erledigen könnte.

    Es gibt im Netz zwar jede menge Programme leider machen viele nicht das was ich brauche und deshalb bin ich gezwungen selber sobald es mir möglich ist zu programmieren, zurechtzustümpern sodaß es läuft.

    Ich nutze dafür nur den Borland oder den Embarcadero Compiler, reicht mir aus.

    Ich werde auch nicht tiefer in die Materie einsteigen das belastet mich zu sehr und der Rest meines beschissenen lebens wird dann noch beschissener.
    Das soll nicht heissen das ich nicht gerne mit der VCL etwas zurechtstümpere das macht mir riesen Spass aber es belastet mich wenn es Probleme gibt einfach zu sehr und dann kann ich an nix anderes mehr denken und das ertrage ich nicht mehr, deshalb muss ich Abstand halten.

    Will auch kein Profi werden im programmieren, da liegen meine Stärken auch gar nicht. Aber ab und zu mal was hilfreiches programmieren was dann auch super läuft und mir das leben mit der Kiste extrem vereinfacht. Ja ich bin mit der Kiste verheiratet :). Aber nur programmieren geht nicht, das war zwar immer mein Wunsch aber es stellte sich halt irgendwann heraus das ich dieser Sache nicht wirklich gewachsen bin und es für mich zu anstrengend ist, aber das ist kein Grund nicht zu programmieren. Es muss halt die richtige Balance haben, Nachteil ist halt das man nicht wiklich eine Ahnung hat, aber mit Grundkenntnissen lässt sich auch eine Menge Anfangen. Habe bestimmt schon so 40 - 50 Programme geschrieben die mir in irgendeiner Weise weiterhelfen. Bis jetzt hat sich kein Programm beschwert das da nen PFEIL zu viel wäre.



  • Abradolf Lincler schrieb:

    ....
    Aber die war auch schon vor 20 Jahren kacke.
    Alles ist darauf ausgelegt, möglichst einfach zu sein (Form1->Label4 = Form3->Edit13->Text).
    Aber dabei kommt halt nichts gutes raus.....

    Wenn du meinst, das alles immer möglichst kompliziert und umständlich sein muss, dann ist jedes Framwork, das dir die Arbeit erleichtert, "kacke". Sogar C++ nimmt dir ja dann schon zuviel ab, ist doch viel zu einfach, einfach Variablen definieren zu können, für sowas muss man Speicheradressen global und auf dem Stack reservieren, nur das ist echtes Können.

    Programmiere du am besten alles mit eine Hexcode Editor, da kommt bestimmt immer was gutes bei raus. Oder ist dir das dann auch schon zu viel WYSIWYG? Dann benutze am besten Lochkarten.

    😃 😃 😃 😃 😃 😃


Anmelden zum Antworten