Gebrauchsbeispiele für Iteratoren



  • Hallo!

    Ich schaue mir gerade die STl ein wenig an und spiele damit herum.
    Nun würde ich gerne wissen wieso bei folgendem Beispiel für a.x nicht 20 angezeigt wird:

    #include <iostream>
    #include <vector>
    using namespace std;
    
    class Point
    {
    	public:
    		Point(){ x=0; y=0; z=0; };
    		float x,y,z;
    };
    
    Point a,b,c;
    
    int main()
    {
    	vector<Point> pvector;
    
    	pvector.push_back(a);
    	pvector.push_back(b);
    	pvector.push_back(c);
    
    	vector<Point>::iterator vIterator = pvector.begin();
    
    	a.x = 20;
    
    	for(vIterator; vIterator != pvector.end(); vIterator++) 
    		cout<<vIterator->x<<endl; // a == 0??
    
    	return(0);
    }
    

    Und wofür benutzt man Iteratoren, was sind wirklich typische praxisnahe Einsatzbeispiele?



  • Hallo,

    weil a in den vector packst, bevor du dessen Membervariablen x den Wert 20 zuweist.



  • ach so, danke!

    Wie steht es mit Anwendungsbeispielen? Was kann ich mit Iteratoren machen, was ich sonst nicht könnte bzw. was geht damit erheblich leichter?



  • ololol schrieb:

    ach so, danke!

    Wie steht es mit Anwendungsbeispielen? Was kann ich mit Iteratoren machen, was ich sonst nicht könnte bzw. was geht damit erheblich leichter?

    Du hast doch selbst ein Beispiel geschrieben, indem du über alle Objekte des Vectors "iterierst". Wenn du noch 2000 Objekte in den Vector kopierst, würden die auch alle angezeigt.



  • Aber warum nicht

    cout<<pvector[0].x<<endl;
    

    😕



  • Iteratoren sind vor allem für template-Funktionen ziemlich praktisch, weil sie ein recht einfaches Interface haben, also einen sehr simplen Weg bieten, Positionen und Bereiche zu markieren. Nimm zum Beispiel das hier:

    #include <iostream>
    #include <iterator>
    #include <list>
    
    // Geht mit Iteratoren. Mit [] kriegst du Probleme, weil std::list
    // keinen operator[] kann (aus ziemlich offensichtlichen 
    // Performancegründen...;) )
    template<typename iter_t> 
    void double_all_in_range(const iter_t &begin, const iter_t &end) {
      for(iter_t pos = begin; pos != end; ++pos)
        *pos *= 2;
    }
    
    int main() {
      int my_array[] = { 1, 2, 3, 4 };
      std::list<int> my_list;
    
      my_list.push_back(1);
      my_list.push_back(2);
      my_list.push_back(4);
      my_list.push_back(8);
    
      double_all_in_range(my_array, my_array + 4);
      double_all_in_range(my_list.begin(), my_list.end());
    }
    


  • Weil du ja dann wissen müsstest, wie viele Elemente insgesamt vorhanden sind. Außerdem kannst du zwar so bei Vectoren auf einzelne Elemente zugreifen, aber bei Listen z. B. nicht mehr. Und iteratoren bieten dann das gleiche Interface für verschiedene Container an:

    #include <iostream>
    #include <list>
    using namespace std;
    
    class Point
    {
        public:
            Point(){ x=0; y=0; z=0; };
            float x,y,z;
    };
    
    Point a,b,c;
    
    int main()
    {
        list<Point> plist;
    
        a.x = 20;
    
        plist.push_back(a);
        plist.push_back(b);
        plist.push_back(c);
    
        list<Point>::iterator vIterator = plist.begin();
    
        for(vIterator; vIterator != plist.end(); vIterator++)
            cout<<vIterator->x<<endl; // a == 0??
    
        return(0);
    }
    


  • ah danke, so langsam kommen mir die ersten ideen zur verwendung 😃


Anmelden zum Antworten