stl iteratoren anwenden



  • 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