problem mit vector



  • hi guten tag,

    ich hab da ein prob und brauche hilfe:
    Ich habe eine klasse part:

    class part
    {
    public:
     void do_anything(void)
     {
      2++
     }
    };
    

    stark vereinfacht. es geht ums prinzip.

    so nun weiter gehts:

    vector<part> kette;
    //ein paar part-elemente anlegen
    //... habe ich gemacht
    
    vector<part>::iterator it;
    
    for(it = kette.begin(); it != kette.end(); it ++)
     //und nun soll von jedem element die do_anything fkt aufgerufen werden
     //damit klappts nicht ;-(
     kette.do_anything();
    

    weiß jemand wie ich auf das elemtn eines vectors zugreifen kann

    mfg freaker



  • in deinem fall muss es so aussehen. bei STL containern dienen die iteratoren als "zugriffelemente" auf deren inhalt:

    vector<part> kette;
    //vector füllen
    vector<part>::iterator it;
    
    for(it = kette.begin(); it != kette.end(); ++it) 
    //++it ist schneller als it++, da intern keine kopie 
    //des iterators erfolgen muss
    {
       it->do_anything(); //oder: (*it).do_anything(); 
    }
    

    beim vector ist allerdings der index-operator überladen und vorzuziehen (=performanter), da es sich intern um ein simples array handelt:

    vector<part> kette;
    //vector füllen
    for(int pos = 0; pos<(int)kette.size(); pos++)
    {
       kette[pos].anything();
    }
    


  • um einheitlich zu bleiben ist aber die methode mit dem iterator vorzuziehen meiner meinung nach.

    ist aber natürlich geschmackssache.



  • vielen lieben dank 🙂



  • :):):) schrieb:

    um einheitlich zu bleiben ist aber die methode mit dem iterator vorzuziehen meiner meinung nach.

    ist aber natürlich geschmackssache.

    das ist klar. Performanter ist die inizieung allemal, was sich insbesondre bei Strömungssimulationen mit einer frossen Anzahl an langen Vektoren durchaus bemerkbar macht.
    Jedoch föllt hier das range_checking weg, dafür müsste man kett.at(pos) verwenden. Obwohl man mit vs8.0 zumindest im debug modus noch über eine überschreitung des arrays informiert wird...



  • Am sinnvollsten ist hier wohl immer noch eine std::list. Dann macht der Zugriff über Iterator auch Sinn.



  • darthdespotism schrieb:

    Am sinnvollsten ist hier wohl immer noch eine std::list. Dann macht der Zugriff über Iterator auch Sinn.

    ist doch garnicht das thema, hier wird doch nur gefragt wie man auf einen vector zugreift.


Anmelden zum Antworten