Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

21

10.08.2009, 14:49

Zitat von »"Databyte"«

Hmm was ist denn eigentlich der Vorteil von iteratoren...
bei std::list ist es ja klar... aber bei std::vector ?...

Naja es bringt vtl ein bisschen leserlichkeit... aber sonst ?


Sie bieten ein einheitliches Interface, um auf Daten in Container zu arbeiten. Wenn man jetzt ein Funktions Template schreiben will, welches auf verschiedene Arten von Containern arbeitet, dann ist das sehr hilfreich, weil man dann sicher durch den Container iterieren kann, ohne wissen zu müssen, wie er aufgebaut ist. Z.B unterstützt ja std::vector einen Random Access Zugriff, was jetzt eine std::list nicht tut. Wenn ich jetzt allerdings durch die Liste iterieren will, kann ich das genau gleich tun. Das geht weder mit dem [] - Operator, noch mit rohen Zeigern.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

22

10.08.2009, 14:52

Iteratoren bieten einfach eine einheitliche Möglichkeit um durch Container zu iterieren. Dadurch, dass das einheitlich bleibt kann z.B. ein verwendeter Containertyp ganz einfach ausgetauscht werden, man bleibt also flexibel... Iteratoren bieten sogar noch mehr Flexibilität (man siehe z.B. die Algorithmen aus der Standard Library).
Außerdem verhindern Iteratoren einige potentielle Fehlerquellen (out of range Zugriffe oder Zählerüberlauf...)

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

23

10.08.2009, 15:14

Zitat

Außerdem verhindern Iteratoren einige potentielle Fehlerquellen (out of range Zugriffe oder Zählerüberlauf...)

iteratoren verhindern keine out-of-range Zugriffe. Wenn du zu weit iterierst (hinter das ende) dann ist der Iterator in einem undefinierten Zustand und bringt sehr wahrscheinlich das Programm zum Absturz, wenn dieses versucht ihn zu dereferenzieren
Signaturen werden überbewertet

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

24

10.08.2009, 15:25

Zitat von »"GR-PA"«

Zitat

Außerdem verhindern Iteratoren einige potentielle Fehlerquellen (out of range Zugriffe oder Zählerüberlauf...)

iteratoren verhindern keine out-of-range Zugriffe. Wenn du zu weit iterierst (hinter das ende) dann ist der Iterator in einem undefinierten Zustand und bringt sehr wahrscheinlich das Programm zum Absturz, wenn dieses versucht ihn zu dereferenzieren


Ok, ich hab mich nicht klar ausgedrückt: Das Pattern, um durch einen Container zu iterieren, ist ja einheitlich. Wenn man sich daran hält hat man definitiv keine Probleme mit OOR-Zugriffen. Will sagen: Iteratoren bieten eine indirekte Möglichkeit diese Fehlerquellen zu vermeiden.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

25

10.08.2009, 15:59

Zitat von »"David_pb"«

Will sagen: Iteratoren bieten eine indirekte Möglichkeit diese Fehlerquellen zu vermeiden.


Würd ich auch nicht ganz so sagen. Immerhin führt bereits der von dir gepostete Code zu undefiniertem Verhalten falls der Container leer ist (abgesehen davon dass er nur mit random access iteratoren funktioniert und daher die leichte Austauschbarkeit des verwendeten Containers auch nicht wirklich vorhanden ist):

C-/C++-Quelltext

1
2
3
4
5
6
7
  for ( std::vector<int>::const_iterator it = myvector.begin()+1;  // <-- bumm

        counter < 4 && it != myvector.end(); ++it ) 
  { 
        counter = ( ( *it-*(it-1) ) == 1 ) 
              ? counter + 1 
              : 0; 
  } 

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

26

10.08.2009, 16:04

Zitat von »"dot"«

Zitat von »"David_pb"«

Will sagen: Iteratoren bieten eine indirekte Möglichkeit diese Fehlerquellen zu vermeiden.


Würd ich auch nicht ganz so sagen. Immerhin führt bereits der von dir gepostete Code zu undefiniertem Verhalten falls der Container leer ist (abgesehen davon dass er nur mit random access iteratoren funktioniert


Ich dachte Databyte's Frage bezog sich allgemein auf Vorteile von Iteratoren. Wie auch immer, der von mir gepostete Code entspricht ja auch nicht dem eben angesprochenen "Standard Pattern"...

Werbeanzeige