Vektor teilweise iterieren



  • Über einen Vektor iteriert man ja folgendermaßen:

    for (std::vector<int>::iterator it = myvector.begin() ; it != myvector.end(); ++it)
    

    Also von Anfang bis Ende. Gibt es einen Befehl wie ich über Vektorteile iteriere?
    Also beispielsweise von Element 5 bis Element 10?



  • for(int i = 5; i < 10; ++i)
    {
    
      // mach was mit myvector[i]
       ...
    


  • Du kannst auch zu begin() eine Zahl addieren, also z.B.

    for (auto it = myvector.begin() + 5; it != myvector.begin() + 10; ++it)
    

    Das würde also von 5 (inklusive) bis 10 (exklusive) iterieren. Du solltest vorher sichergestellt haben, dass der vector auch groß genug ist.

    Alternative ist halt, wie schon geschrieben, direkt über den index zu gehen:

    for (size_t i = 5; i < 10; ++i) ...
    


  • wob schrieb:

    Du kannst auch zu begin() eine Zahl addieren, also z.B.

    for (auto it = myvector.begin() + 5; it != myvector.begin() + 10; ++it)
    

    Wenn schon. dann:

    for (auto it = myvector.begin() + 5; it != myvector.end() && it != myvector.begin() + 10; ++it)
    


  • Wofür soll dieser zusätzliche Check gut sein?

    Ich hatte geschrieben:

    Du solltest vorher sichergestellt haben, dass der vector auch groß genug ist.

    Wenn man das gemacht hat, braucht man den Check innerhalb der Schleife nicht. Und diesen Check muss man sowieso machen - wer sagt dir denn sonst, dass dein Start (also myvector.begin() + 5 ) überhaupt gültig ist? Und außerdem: wenn jemand von 5-10 iterieren will, ist nicht sichergestellt, dass derjenige bei einer Vectorsize von 8 dann von 5 bis 7 loopen will. Könnte auch sein, dass man dann was ganz anderes machen will. Ich würde den end-Iterator wohl vor der Loop berechnen, wollte ich auch sowas wie 5 bis 7 erlauben.


  • Mod

    Random-access Iteratoren kann man auch auf größer oder kleiner vergleichen.



  • oder mit range based for

    list<int> L(10 - 5 + 1);
    iota(L.begin(), L.end(), 5);
    for (auto i : L)
      do_something_with(myvector[i]);
    

Anmelden zum Antworten