Iterator



  • Hallo,

    es gibt doch keinen Unterschied zwischen Zeiger und Iterator.

    Der Iterator ist nur auf die Container Typen wie vector<> abgestimmt. Ich kann einen Iterator auf einen vector<int> verweisen lassen aber keinen Zeiger.



  • Ein Zeiger ist ein Iterator, aber ein Iterator ist nicht automatisch ein Zeiger (auch nicht "intern").

    Ich kann einen Iterator auf einen vector<int> verweisen lassen aber keinen Zeiger.

    Bitte was? Wie kommst du darauf und was meinst du überhaupt?



  • blurry333 schrieb:

    es gibt doch keinen Unterschied zwischen Zeiger und Iterator.

    Iteratoren sind ein Konzept, ein Zeiger quasi eine Umsetzung.

    blurry333 schrieb:

    Der Iterator ist nur auf die Container Typen wie vector<> abgestimmt. Ich kann einen Iterator auf einen vector<int> verweisen lassen aber keinen Zeiger.

    Wie gesagt, Iteratoren sind ein Konzept. Sie dienen als Bindeglied zwischen Daten und Algorithmen. Das müssen nicht irgendwelche STL - Container sein, sondern alles, über das man iterieren kann (sieh zb. boost). Außerdem verweist du nicht auf den Container, sondern auf dessen Elemente. Bei Vektor und Array kannst du außerdem auch mit Zeigern arbeiten.

    Was ist eigentlich deine Frage?



  • blurry333 schrieb:

    Hallo,

    es gibt doch keinen Unterschied zwischen Zeiger und Iterator.

    Der Iterator ist nur auf die Container Typen wie vector<> abgestimmt. Ich kann einen Iterator auf einen vector<int> verweisen lassen aber keinen Zeiger

    Kannst auch Zeiger, wenn ich mich nicht irre. Hab hier sowas grade, weil ich damit selbst rum spiele. Kein Plan ob du sowas meinst. Das vector befühlen ist total schlecht ich weiß aber ich wollte auf die schnelle was mit struct und Zeigern testen. Ist allerdings alles char und nicht int aber das ist ja nicht so wichtig.

    #include <iostream>
    #include <string>
    #include <stdint.h>
    #include <vector>
    
    struct pos{
      char *ptr;
      int  count;
    }; 
    
    int main(){   
      pos mpos;
      mpos.count = 0;
      std::vector<char> vec;
      vec.push_back((char)0xfe);
      vec.push_back((char)0x23);
      vec.push_back((char)0x29);
      vec.push_back((char)0xff);
      vec.push_back((char)0x12);
      vec.push_back((char)0x12);
      vec.push_back((char)0xf2);
      std::vector<pos> fin;
      char *p = vec.data();
      for(unsigned int i=0; i<=vec.size(); ++i){
        if(p[i] = (char)0xff){
          mpos.ptr = &p[i]; //Zeiger auf 0xff in dem vector vec, der Zeiger wird dann im struct gespeichert
          ++mpos.count;
          fin.push_back(mpos);
        }
      }
      std::cout << mpos.ptr[0] << '\n';
    }
    


  • blurry333 schrieb:

    es gibt doch keinen Unterschied zwischen Zeiger und Iterator.

    was steckt dahinter?

    Ein Zeiger geht immer über eine linearen Speicherbereich.

    Der Iterator ist ein Entwurfsmuster und stellt Möglichkeiten zur Verfügung, auf Elemente einer Struktur sequenziell zuzugreifen, ohne die Struktur zu enthüllen und daher ohne dass diese Struktur linear im Speicher liegen muss.

    Beispiel: Mit einem Iterator kann ich über eine verkette Objekt-Liste laufen.

    Ciao
    MM



  • Ein Zeiger geht erstmal gar nicht. (<-- Punkt)

    Mit Zeigerarithmetik lässt sich der Indexoperator eines linearen Speicherbereichs ersetzen. Das ist richtig, Sicherheit und so weiter ist aber eine ganz andere Geschichte.

    Iteratoren sind ein Konzept einheitlich über die Daten einer Datenstruktur zu traversieren, die Daten anzufordern und ggf. zu manipulieren. Dadurch ist eine Entkopplung von Algorithmen und Datenstrukturen möglich, die ohne diese einheitliche Schnittstelle nicht möglich wäre und Kohärenz unabhängiger Module extremst erhöht. Und das ist ja nicht gewollt.

    qsort(void * base, size_t count, size_t size, int (*cmp)(const void*, const void*);
    

    Ist der Standard-Quicksort aus C. Aber setzt da mal eine verkettete Liste ein oder einen Baum. (Verlangt wird hier, dass es den operator[] gibt oder man per Pointerarithmetik arbeiten kann)

    Nimmst du aber Iteratoren, gibst vor, dass diese 2-3 Operationen können müssen, dann hast du schon viel Unabhängigkeit

    std::sort(Iter first, Iter last, CmpFunc cmp);
    // wobei das zu
    std::sort(Iter first, Iter last, bool (*cmp)(Foo a, Foo b));
    // wird
    

    So in etwa...

    Aber das erklären einschlägige Bücher oder Online-Artikel weit besser als ich... (GoF)


Anmelden zum Antworten