Qt-Frage -> QPtrList

toxrocks

Grünschnabel
Hallo,

weiß jemand, ob es eine Möglichkeit gibt, eine verkettete Liste vom Typ QPtrList nach einem Variablen-Wert eines Eintrages zu durchsuchen und den Index zurückgeben zu lassen, um ihn zB zu löschen?

Mache das im Moment so:

Code:
QPtrList<CanData> candataList;
CanData *candata;

void MyContainer::eraseIdEntry(int ident)
{
	for (candata=canDataList.first(); candata!=0;candata=canDataList.next())
	{
		if (candata->id==ident)
		{
			canDataList.setAutoDelete(TRUE);
			canDataList.remove();
			canDataList.setAutoDelete(FALSE);
		}
	}	
}

Dachte, das geht irgendwie mit find(), aber irgendwie kann man da auch nicht nach den Variblen in den Einträgen suchen.

Gruß, Notwist
 
Hab ja die Ressourcen gelesen, find aber kein Beispiel und ich konnte bis jetzt nicht mit find auf die einzelnen Variablen zugreifen. Manchmal check ich die Definitionen auch nicht auf Anhief *schäm*. Vielleicht hast Du ja Beispiel-Code, wie ich das mit FIND machen könnte.

Er hat bei mir zB beim compilen nicht gemeckert bei:

Code:
int index = canDataList.find(candata);

Aber was bringt mir das? Wäre ja genau das, was ich mit meiner for-Schleife bzw. mit at() machen würde.

Und warum ist
Code:
QPtrList<CanData*> candataList;
besser? Muss dazu sagen, ich bin noch nicht ganz so lange dabei mit Programmieren und habe bei Zeigern, Referenzen und so immer noch Verständnisprobleme. Das wäre doch nur ein Zeiger auf canDataList, d.h. es wird noch kein Speicher dafür verwendet. Irgendwann müsste ich das doch eh machen und da die Liste die ganze Programmlaufzeit bestehen soll, muss ich die doch eh einmal ohne * instanzieren, oder?

Gruß, Toxrocks
 
Hallo,
Hab ja die Ressourcen gelesen, find aber kein Beispiel und ich konnte bis jetzt nicht mit find auf die einzelnen Variablen zugreifen. Manchmal check ich die Definitionen auch nicht auf Anhief *schäm*. Vielleicht hast Du ja Beispiel-Code, wie ich das mit FIND machen könnte.

int QPtrList::find ( const type * item )

Finds the first occurrence of item in the list.

If the item is found, the list sets the current item to point to the found item and returns the index of this item.

Sprich die QPtrList sollte nach dem Aufruf von find() auf dein Element zeigen,
also sollte ein einfaches remove() ausreichen.
Also:
Code:
candataList.find(yourElement);
candataList.remove();
Oder du versuchst es so:
Code:
candataList.remove(candataList.find(yourElement));
Und warum ist
Code:

QPtrList<CanData*> candataList;

besser? Muss dazu sagen, ich bin noch nicht ganz so lange dabei mit Programmieren und habe bei Zeigern, Referenzen und so immer noch Verständnisprobleme.

Wenn du es so machst wie bisher wird das Objekt wenn du es dir von der QPtrList
von irgendeiner Methode zurückgeben lässt jedesmal eine Kopie bei der Rückgabe
erzeugt. Da du ja die Objekte selbst in der QPtrList gespeichert hast.
Wenn diese Objekte entsprechend groß bzw komplex sind kann das ziemlich
zeitaufwendig werden.
Wenn du dahin gegen nur die Pointer auf deine Objekte in der QPtrList speicherst
wird bei einer Anforderung aus der QPtrList immer nur die Referenz zurückgegeben
und die ist lange nicht so groß wie ein komplettes Objekt.

Hoffe ich konnte a weng Licht ins Dunkel bringen bzw mich verständlich
ausdrücken.

Gruß

RedWing
 
Wenn er aber nur die Zeiger in der Liste speichert, wird dann bei find() nicht auch nur nach dem Zeiger gesucht und nicht nach dem Inhalt des Objektes? Ein Match käme dann nur zustande, wenn es sich tatsächlich um den gleichen Zeiger handelt und nicht, wenn der Inhalt des Objektes gleich ist.
Ich kenne mich mit Qt nicht aus, ist nur eine Frage.
 
jokey2 hat gesagt.:
Wenn er aber nur die Zeiger in der Liste speichert, wird dann bei find() nicht auch nur nach dem Zeiger gesucht und nicht nach dem Inhalt des Objektes? Ein Match käme dann nur zustande, wenn es sich tatsächlich um den gleichen Zeiger handelt und nicht, wenn der Inhalt des Objektes gleich ist.
Ich kenne mich mit Qt nicht aus, ist nur eine Frage.

Hast schonrecht, aber ich denkmal wenn die zeiger gleich sind dann sollten auch die
Obejkte auf die sie zeigen dieselben sein...

Gruß

RedWing
 
Zurück