Seite 1 von 1

QList oder QVector splitten

Verfasst: 18. Januar 2010 14:58
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

Verfasst: 18. Januar 2010 15:42
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 ...

Verfasst: 18. Januar 2010 15:45
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.

Verfasst: 18. Januar 2010 16:15
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 ...

Verfasst: 19. Januar 2010 08:59
von anno1988
was ich gemacht habe war das hier:

Code: Alles auswählen


int *vec_data;

vec_data = v.data();

vec_data[0] = 5;


Verfasst: 19. Januar 2010 10:37
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 ...

Verfasst: 19. Januar 2010 10:45
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.

Verfasst: 19. Januar 2010 12:13
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 ...

Verfasst: 19. Januar 2010 12:16
von anno1988
Ersetzen kann ich meinen vector ohne probleme gegen eine Liste.

Das sollte kein Problem sein.

Verfasst: 19. Januar 2010 12:23
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 ...

Verfasst: 19. Januar 2010 12:36
von anno1988
werde ich machen. danke.