QList oder QVector splitten

Alles rund um die Programmierung mit Qt
Antworten
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

QList oder QVector splitten

Beitrag von anno1988 »

Hallo zusammen.

Ich habe mich gefragt ob es irgendeine Standardmethode dafür gibt eine QList oder ein QVector bei einem bestimmten Index zu teilen und dann daraus 2 Listen zu machen.

Bisher würde ich es so machen:

Code: Alles auswählen


QVector<QString> vec1;
QVector<QString> vec2;

bool VecSplit(int start, int end, QVector<QString> *vec1, QVector<QString> *vec2) {

if(start < 0 || end < 0 || end > vec1->size()) {

return false;

}

for(int i=start; i < end; i++) {

vec2->push_back(vec1.at(i));

}

vec1->remove(start, end - start);


return true;


}


Außer es gibt natürlich eine elegantere Lösung. Wenn die jemand hat, wäre ich dafür sehr dankbar.

gruß anno1988
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

auf was legst du mehr wert, Elegance oder performance ?

Prinzipiell:
iterieren zu einer bestimmten Pos ? warum dann Vector ?

Dein Ansatz hat den Vorteil, das er fuer alle container gaenge, mit dem entscheidenden nachteil das er Containerspezifikas aus acht laesst, und z.b. fuern vector relativ unperformant wird.

fuer allgemeine Container wuerd ich sowas schreiben:

Code: Alles auswählen

Container::const_iterator itfrom = c1.begin() +start;
Container::const_iterator itTo = c1.begin() +end; /// vorrausgesetzt das end iss exclusive

c2 = Container(itfrom ,itTo);
c1.remove(itfrom,itTo); 

/// Container = irgend ein Container mit iterator schnittstelle (QVector<int> oder std::list<double>) oder irgdenwas 
/// c1 und c2 instanzen der Container ... der c1 der beschnitten werden soll, c2 wo der verschnitt rein soll . 

Startbedingen usw musst natuerlich noch abpruefen ... neen iterator weit uebers ende macht manchmal ned gluecklich :-)

bei vectoren mit PODS wuerd ich eher direkt auf die Zeiger gehen, bin mir ned sicher ob die QT die vector iteratoren zu zeigern aufloest, ansonsten wuerde die obigen Operationen mit den Iteratoren zu denen mittels zeigern gleichwertig sein.
Und das remove wuerd ich bei pods durch speicherkopien ersetzen ....

Aber jenachdem wie elegant oder performant man es braucht. ...

Ciao ...
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

Also die performanteste Lösung ist mir am liebsten.

Aber das ist ein sehr guter Ansatz für mich.

Thx für die Hilfe.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Also die performanteste Lösung ist mir am liebsten.
Dann ist die erste Frage, ist dein Vector ueberhaupt gerechtfertigt ?
Verwendest du den Container ueber den Index-Zugriff, also schreibst sowas wie v.at(5) oder v[3] ????

Ciao ...
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

was ich gemacht habe war das hier:

Code: Alles auswählen


int *vec_data;

vec_data = v.data();

vec_data[0] = 5;

RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

vec_data[0] = 5;
naja, wenns das nur mit der 0 machst, kannst das auch anders loesen :-)
Aber ich geh mal davon aus das du den index zugriff brauchst, und dass der auch schnell sein muss.

dann bleibt noch die frage, besteht derr vector aus PODs oder sind da instanzen drin ?
QVector<QString>
wenn das ned nurn Beispiel iss, sinds Instanzen

Dann wirds eh recht "aehm" unperformant.
wenn die container wirklich aufsplitten willst/musst wirst so um kopien der strings ned drumherumkommen ... und muesstest es aehnlich machen wie oben beschrieben.

Aber die Praxis zeigt, das zu 99% bei vectoren auf strings entweder die strings als instanzen oder der indexzugriff unnötig ist, und da optimierungspotential steckt. Aber dazu muss man viel mehr uebers Umfeld wissen.

Ciao ...
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

Bei mir habe ich es so gemacht, dass ich das Template eine Klasse habe.

Also im Vector:

Code: Alles auswählen


QVector<Klassen_Name> vec;

Es kommt ganz drauf an. Oftmals brauche ich einfach in der Schleife einen Index da ja mehrere Sachen berechnet werden müssen.

Aber ich denke schon, dass die Lösung von dir soweit ok ist, die du ein paar Beiträge vorher geschrieben hast.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Oftmals brauche ich einfach in der Schleife einen Index da ja mehrere Sachen berechnet werden müssen.
Die frage ist, ob du z.b. den vector, durch ne Liste ersetzen kannst.
"Listen" sind um vieles performanter, was das einfuegen und loeschen angeht.
Den vector brauchst, wenn du richtig schnell aufs z.b. 5.te element zugreifen musst, oder deine daten wirklich am stuck hintereinander liegen haben musst (C Array kompatiblitaet), letzteres faellt bei Instanzen eh meist raus, weil man da soweiso ned mit c funktionen raufrumrutscht.

Ciao ...
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

Ersetzen kann ich meinen vector ohne probleme gegen eine Liste.

Das sollte kein Problem sein.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

dann mach das.
vectoren solltest eigentlich immer nur nehmen, wenn die auch wirklich brauchst.
Doof iss nur, das bei den ganzen c++ Tuts und Schulungen usw. wegens der vergleiche zu c, der vector als erstes behandelt wird. Was irgendwie den eindruck erweckt, das der vector der "Standardcontainer" iss.

Also nimm obriges Beispiel, und ersetz den vector durch ne QLinkedList

Ciao ...
anno1988
Beiträge: 280
Registriert: 23. Januar 2009 20:49

Beitrag von anno1988 »

werde ich machen. danke.
Antworten