stl iteratoren anwenden



  • ok dann werden sie nicht dazu verwendet aber sind
    nach meinem wissen urprünglich dafür gedacht

    weiss jemand wies geht?



  • Sie waren auch nicht urprünglich dafür gedacht. Ihr Zweck besteht
    im "Durchlaufen" eines Containers. Und genau diese Aufgabe erfüllen,
    sie. Sie werden insbesondere durch "Algorithmen" verwendet die mit
    Containern arbeiten. Sie sind eine "Art von Zeiger" und bei einigen
    Containern die einzige Art alle Elemente aufzulisten.
    "for_each" beispielsweise durchläuft einen Container bzw. einen Bereich
    und wendet eine Funktion auf jedes Element des Containers an das mittels Iterator zurückgeliefert wird.

    mfg JJ



  • Ich glaube er will nur wissen wie das geht oder?

    Sovok schrieb:

    ok dann werden sie nicht dazu verwendet aber sind
    nach meinem wissen urprünglich dafür gedacht

    weiss jemand wies geht?

    vector<Klasse*> Klassenvector;
    
    // Füllen, damit arbeiten etc.
    
    vector<Klasse*>::iterator itBegin = Klassenvector.begin(); // Iterator der "aufs erste Element zeigt" holen
    
    long value = (*itBegin)->Attrib1();
    

    Das war alles, ungeprüft eben so hier getippt.



  • ne ich habs anders gemeint

    vector<Klasse*> Klassenvector; 
    
    // Füllen, damit arbeiten etc. 
    
    vector<Klasse*>::Spezial_Iterator itBegin = Klassenvector.begin(); 
    // Iterator der "aufs erste element mit attrib1() == 100 und attrib2() == 200" holen 
    //d.h. der iterator prüft intern die werte
    
    (*itBegin); //hat garantiert attrib1() == 100 und attrib2() == 200 oder ist == Klassenvector.end()
    


  • vector<Klasse*>::Spezial_Iterator itBegin = Klassenvector.begin();
    
    for(itBegin; itBegin != Klassenvector.end(); ++itBegin)
    {
      if((*itBegin)->Attrib1() == 100 && (*itBegin)->Attrib2() == 200)
              break;
    }
    
    (*itBegin); //hat garantiert attrib1() == 100 und attrib2() == 200 oder ist == Klassenvector.end()
    

    Oder versteh ich da etwas grundsätzlich falsch 😕



  • Ichdenke schrieb:

    Oder versteh ich da etwas grundsätzlich falsch 😕

    ja tust du 😉

    ich will dass der iterator intern die werte prüft
    "unsichtbar im code der durch die liste geht"

    also ein spezieller interator die mir nur objekte mit bestimmten werten liefert



  • "ein iterator ist alles was sich wie ein iterator verhält"
    das was du willst, ist garkein iterator mehr 😉
    ansonsten:sort benutzen,sodass die benötigten werte am anfang stehen, und diese dann solange bearbeiten, bis man am erstenw ert angekommen ist, der nicht mehr den anforderungen entspricht



  • schade 😞
    mir hat mal jemand erzählt, dass des geht



  • Hallo,
    was du brauchst ist ein filter_iterator wie z.B. http://www.boost.org/libs/iterator/doc/filter_iterator.html

    Oder du verzichtest auf handgeschriebene Schleifen und verwendest stattdessen einen Standard-Algo zusammen mit einem Prädikat.



  • Sovok schrieb:

    z.b. durch alle elemente mit attrib1() == 100 und attrib2() == 200

    #include <boost/iterator/counting_iterator.hpp>
    #include <algorithm>
    #include <iostream>
    
    int main()
    {
      Klasse klass;
      //...
      std::copy(
         boost::make_counting_iterator(klass.attrib1()),
         boost::make_counting_iterator(klass.attrib2()),
         std::ostream_iterator<long>(std::cout, "\t"));
      //...
    }
    


  • lol in letzter zeit kommts mir so vor als würde ich bei jeder frage auf boost verwiesen 😉

    gibts aussichten, dass teile von boost irgendwann zum offiziellen c++ standard gehören?



  • ja, einige teile sind soweit ich weis, fest eingeplant


Anmelden zum Antworten