qlisten

Verschiedenes zu Qt
douala
Beiträge: 1
Registriert: 23. Mai 2010 11:15

qlisten

Beitrag 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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag 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)... :wink:
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag 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)
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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. :)
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

@RHBaum: Ich wollte keine Grundsatzdiskussion vom Zaun brechen sondern lediglich zu einer Aussage eine Begründung :wink:
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 :wink:)
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 :wink:

Das ist nun aber OT... bin via PN gerne bereit weiter darüber zu diskutieren.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 (Index-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
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag 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 :P

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 :P
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag 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.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag 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 ...
kater
Beiträge: 306
Registriert: 29. Dezember 2009 01:13
Wohnort: Darmstadt

Beitrag von kater »

Ich steh da echt auf dem Schlau. Gib mir mal ein Beispiel wie ich es sonst machen soll.
Antworten