Seite 1 von 2
qlisten
Verfasst: 25. Mai 2010 10:44
von douala
Hallo liebe Leute ,
ich hätte da mal eine Frage zu QListen.
Und zwar will ich wissen ob man die listen mit dem index 0 beginnend iteretieren kann.
Greiffe ich mit qliste.at(0) auf das erste Element einer Liste oder eher mit qliste.at(1) ?
vielen dank
douala
Verfasst: 25. Mai 2010 11:09
von RHBaum
C++ generell ist 0 basierend. Also alle indizies beginnen mit 0 ...
Die QContainer machen da keine Ausnahme.
generell solltest du aber indizies meiden (und iteratoren verwenden) wenn du kannst.
wenn du nicht kannst, du also den direkten zugriff auf das Xte element brauchst, solltest du den einsatz eines QVectors/QByteArrays erwaegen.
Ciao ...
Verfasst: 25. Mai 2010 18:04
von solarix
RHBaum hat geschrieben:
generell solltest du aber indizies meiden (und iteratoren verwenden) wenn du kannst.
Evt. solltest du noch schreiben
warum du die in der Doku als "very fast" (
http://doc.qt.nokia.com/4.6/qlist.html#at) bezeichneten Methoden generell nicht verwendest sondern Iteratoren empfiehlst, zu welchen die Trolls schreiben: "In practice, these are rarely used, because you can use indexes into the QList" (
http://doc.qt.nokia.com/4.6/qlist.html#details)...

Verfasst: 25. Mai 2010 20:46
von upsala
const T & QList::at ( int i ) const
Returns the item at index position i in the list. i must be a valid index position in the list (i.e., 0 <= i < size()).
This function is very fast (constant time).
Das sollte eigentlich alles beantworten.
(Vorausgesetzt douala mein mit QListen eine QList)
Außerdem ist ein Iterator eigentlich die bessere Zugriffsmethode, da dieser genau dafür optimiert ist. (und bei QList ist der Iterator und at() gleich schnell)
Verfasst: 26. Mai 2010 10:35
von RHBaum
@solarix
Ich verwende QList schon ab und an, aber an Stellen wofuer sie eigentlich auch super praktisch ist. Und das ist fast ausschliesslich in verbindung mit ItemModels.
Ansonsten bin ich, wie scho oft angedeutet, c++ Entwickler und kein QT Entwickler ^^ Der Unterschied iss vielleicht klein, aber fein
Das heisst ich steh auf Standards, und die QT ist kein Standard.
In der STL gibt es nix vergleichbares zu QList. Wenn man sich bissi mit den Techniken und Hintergründen auseinandersetzt, weiss man auch warum.
und "very fast" iss alles andere als ne zusicherung die ner c++ Kommision standhalten würd ^^
Worum es mir geht, iss halt gleich jeglichen Code in der Art:
Code: Alles auswählen
for(int i = 0; i < myQList.size(); ++i)
{
/// tu irgendwas mit myQList.at(i)
}
gleich im Keim zu ersticken.
Kein Problem wenn Anfänger / Einsteiger das zu Beginn Ihrer C++ Karriere noch schreiben, weil sie es ned besser wissen.
Aber spaetestens wenn wer Versucht das zu verteidigen, sollt er sich doch Fragen, ob er bei ner anderen Programmiersprache ned besser aufgehoben iss.
Ciao ...
Verfasst: 26. Mai 2010 16:01
von kater
Hey, da muss ich doch mal was ganz dummes Fragen. Programmiere privat seit eingen Jahren C/C++ und durchlaufe meine Vectoren immer in Schleifen mit dem Indexzugriff.
Nun die dumme Frage. Wozu braucht man Iteratoren? Habe schon so viele Leute gefragt und überlegt und komm einfach nicht drauf.
Vllt. hat jemand die Gedult und mag etwas dazu sagen.

Verfasst: 26. Mai 2010 22:18
von solarix
@RHBaum: Ich wollte keine Grundsatzdiskussion vom Zaun brechen sondern lediglich zu einer Aussage eine Begründung
Zum einen weil das in einem Forum dazugehört und zum anderen weil ich anderer Meinung bin.. zur Vervollständigung noch meine Argumente:
- ein kleiner Benchmark ergab mir mal, dass die QList-Indexe mindestens gleich schnell sind wie Iteratoren.
- Wenn es zu einer Lösung zwei gleichwertige Varianten gibt ziehe ich die lesbarere vor (ich mag diesen Template-Iterator-Code nicht

)
Daher bin ich der gleichen Meinung wie die Trolls (STL-Style für die STL-Fans, Java-Style für die Java-Fans, Indexe für den Rest... wenn es um die blosse Traversierung geht).
Aber spaetestens wenn wer Versucht das zu verteidigen, sollt er sich doch Fragen, ob er bei ner anderen Programmiersprache ned besser aufgehoben iss.
Das wär aber schade! Ein kurzer Blick in die QtCore-Sourcen zeigt, dass dann verdammt viele Entwickler bei Nokia abwandern müssten
Das ist nun aber OT... bin via PN gerne bereit weiter darüber zu diskutieren.
Verfasst: 26. Mai 2010 22:48
von franzf
kater hat geschrieben:Nun die dumme Frage. Wozu braucht man Iteratoren? Habe schon so viele Leute gefragt und überlegt und komm einfach nicht drauf.
Eine kleine Zusammenfassung, was es für Iteratoren gibt:
http://www.cplusplus.com/reference/std/iterator/
Der Nutzen? Es ist vor allem mit allgemeinen (also templates)
Algorithmen eine super Möglichkeit, eine Datenstruktur durchzuwandern. Problem ist, dass nicht jeder Container einen Random Access Iterator

ndex-Zugriff) anbietet/anbieten kann (std::list).
Mittlerweile stehen die Programmierer aber mehr auf Ranges, da noch besser und vor allem intuitiver und weniger unleserlicher Code-Bloat.
Wenn du mal Zeit hast - lohnt sich
Verfasst: 26. Mai 2010 23:25
von kater
Danke schonmal. Ja ich denke ich seh den Grund.
Ich hab mein leben Lang noch nie was anderes als den std::vector gebraucht (Jetzt ist es halt QVector). Von den Algos höchstens mal die sort() Funktion.
Die std bietet so viel, und ich brauch es einfach nicht.
Irgendwie sind meine Programme zu einfach aufgebaut. Und wenn es mal kompliziert wird, dann muss ich die Algorythmen selbst schreiben, da es sie schlicht einfach nicht gibt.
Verfasst: 27. Mai 2010 10:28
von RHBaum
@Kater
Es kommt auch wirklich drauf an, auf welchen Level man programmiert.
Das ist jetzt nicht abwertend gemeint, nicht falsch verstehen !
Ich hab mein leben Lang noch nie was anderes als den std::vector gebraucht (Jetzt ist es halt QVector).
Das ist soweit ok, solange Du bei Toolentwicklung, oder reiner GUI-Entwicklung bleibst. Wobei Dirn "richtiger Proejktleiter" immer vorhalten wird, das man mit "einfacheren Sprachen" im Schnitt 20-30% schneller zu ergebnissen kommt
Ausserdem kosten Scriptentwickler ned so viel aufm Arbeitsmarkt ...
Kommst du mal in die Situation, Bibliotheken oder nen Systemunterbau fuer nen groesseres System bauen zu muessen, sieht die Welt komplett anderes aus ^^
Dort spielen Performance, Ressourcenverbrauch, und vor allem Seiteneffektfreiheit / Multithreadfaehigkeit ne ganz andere Rolle, gegenueber den Entwicklungskosten (aka Kosten fuer den Programmierer).
Ciao ...
Verfasst: 27. Mai 2010 14:24
von kater
Jup, werde auch hoffentlich nie in die Position kommen. Habe woanders meine Stärken. Solange man nur für sich selbst Programm schreibt, oder mal als Visualisierungshilfe für Daten mit denen man auf der Arbeit arbeitet, dann schert mich auch kein Standard

Hauptsache die Algos sind sau schnell.
Verfasst: 27. Mai 2010 16:10
von franzf
kater hat geschrieben:JSolange man nur für sich selbst Programm schreibt, oder mal als Visualisierungshilfe für Daten mit denen man auf der Arbeit arbeitet, dann schert mich auch kein Standard

Hauptsache die Algos sind sau schnell.
1) Egal was du machst, der Standard sollte dich interessieren. Er schreibt dir vor was gültiges C++ ist und was nicht.
2) Wenn deine Algos immer sau schnell sind, solltest du vllt. den Beruf wechseln und C++-Optimierer werden
Im Ernst: Wenn die Algorithmen nicht allgemein gehalten werden können und auch außerhalb des Kontext wenig Sinn machen, ist es OK keine allgemeine Schnittstelle (über z.B. Iteratoren als Template-Paramater) anzubieten.
Ansonsten solltest du das mal versuchen

Man muss etwas abstrakter denken, weil man keinen konkreten "MetabolTriangleObserver" hat. Aber wenn du den Algo dann mal wo anders brauchen kannst, bist du der King, weil du einfach nur den Header einbindest und sofort verwenden kannst, ohne den ganzen Code umzuschreiben, nur weil du jetzt keinen "MetabolTriangleObserver" mehr hast sondern nen "AbstractGinTonicEliminator" oder so

Verfasst: 27. Mai 2010 17:30
von kater
Ne, die Algos sind immer vom Problem abhänig. In meinem jetzigen Nebenjob optimiere ich auch einen Algo, also passt schon

Mein letztes Kunstwerk passt eine Hilberkurve in ein unstruktoriertes, ungleichmäßiges Netz an. Das ist alles andere als allgemein

Ich kann eine Datenstuktur anbieten und eine Dokumentation was sie bedeutet.
Aber das ist alles andere als die Container in der std.
Verfasst: 28. Mai 2010 10:50
von RHBaum
durchlaufe meine Vectoren
Ich kann eine Datenstuktur anbieten und eine Dokumentation was sie bedeutet.
könntest du dir vorstellen, dass ein algo zigmal schneller werden könnte, wenn nicht alle daten zwingend in einem block (vector) liegen ?
spaetestens wenn nicht mehr mit vector arbeitest, wirst iteratoren brauchen ...
Ciao ...
Verfasst: 28. Mai 2010 11:21
von kater
Ich steh da echt auf dem Schlau. Gib mir mal ein Beispiel wie ich es sonst machen soll.