fehler bei iterator


  • Administrator

    cooky451 schrieb:

    In Zeile 15 weist du iter schon first_vec.end() zu. Danach erhöht die for-Schleife den Wert noch einmal. Visual Studio im Debugmodus achtet aber darauf, dass Iteratoren ihre Grenzen nicht verlassen. Der Code ist eigentlich korrekt, aber die Debug-"Features" machen dir einen Strich durch die Rechnung. Im Release-Modus sollte es laufen.

    Darf ich fragen, wie du auf die Idee kommst, dass der Code korrekt sein soll? Es steht zwar im Standard, dass es bei den Iteratoren einen Iterator hinter den gültigen Werten gibt, aber mir ist nichts davon bekannt, dass man diesen letzten Iterator weiter erhöhen darf. Ich würde eher sagen, dies ist einfach nicht spezifiziert und unterscheidet sich daher von Kompiler zu Kompiler.

    Wenn man sich die Vorbedingungen eines Input-Iteratoren im Standard anschaut, dann steht beim Inkrementieren sogar, dass der Iterator dereferenzierbar sein muss.

    Grüssli



  • hmm... ich hatte vorher nur subscript und dann wurde mir gesagt das man das selbe auch mit iterators erreichen kann.

    pointers bin ich gerade erst am lesen und functions hatte ich bisher auch nich nicht.

    #include <iostream>
    #include <string>
    #include <vector>
    #include <bitset>
    using namespace std;
    
    int main() {
    const size_t array_size = 10;
    vector<int> first_vec(array_size, 1);
    vector<int> second_vec(9, 1);
    
    for (vector<int>::iterator iter=first_vec.begin(); iter<first_vec.end(); ++iter ) {
    
    if(first_vec[*iter] != second_vec[*iter] || first_vec.size()!=second_vec.size()){
        iter=first_vec.end()-1;
        cout <<"Different";
    
    }
    else {
        if (iter==first_vec.end()-1)
    cout <<"same" << endl;
    
    }
    
    }
    
    }
    

    macht das programm nicht genau das selbe wie dein programm ? es schaut sich jede zahl an und vergleicht sie , ist sie anders oder die größe nicht identisch wird "different" ausgegeben. ansonsten "same"



  • Die Konstruktion first_vec[*iter] ist Unsinn - mit *iter bekommst du bereits das Vektor-Element, auf das der Iterator verweist - den Wert mußt du nicht noch mal an den Index-Operator übergeben (erst recht nicht an den eines anderen Vektors). Wie man es richtig macht, hat cookie schon vorgeführt (die Schleife funktioniert im Prinzip auch ohne in eine Hilfsfunktion verstaut zu werden).



  • Dravere schrieb:

    Ich würde eher sagen, dies ist einfach nicht spezifiziert und unterscheidet sich daher von Kompiler zu Kompiler.

    Da hast du vermutlich recht, ich habe unüberlegt geschrieben.



  • ok

    gesterhn hatte ich den code nch nicht verstanden 😕 aber jetzt weiß ich was er macht.

    vielen dank für die schnelle hilfe

    edit *

    eine syntaktiksche frage hätte ich noch.

    for (; begin != end; ++begin, ++compare)
    

    warum ist ein semikolon am anfang der forschleife und warum werden ++begin und ++compage mit einem komma getrennt und nicht mit einem semikolon ?



  • kantaki schrieb:

    warum ist ein semikolon am anfang der forschleife

    Der Initialisierungsteil der For-Schleife (Teil zwischen öffnender Klammer und erstem Semikolon) ist leer.

    kantaki schrieb:

    und warum werden ++begin und ++compage mit einem komma getrennt und nicht mit einem semikolon ?

    Weil du beide Anweisungen nacheinander ausführen willst. Ein Semikolon darfst du im Schleifenkopf nur zur Trennung von Initialierungs-, Bedingungs- und Update-Teil verwenden.



  • alles klar danke 🙂



  • Äh...

    #include <iostream>
    #include <vector>
    
    int main() {
      std::vector<int> a, b;
    
      std::cout << (a == b ? "gleich" : "ungleich") << std::endl;
    }
    

  • Administrator

    seldon schrieb:

    Äh...

    #include <iostream>
    #include <vector>
    
    int main() {
      std::vector<int> a, b;
    
      std::cout << (a == b ? "gleich" : "ungleich") << std::endl;
    }
    

    😮 *nachschlägt* 😮 😮
    Ich sag es immer wieder, man lernt nie aus in C++ 😃
    geht ein paar std::equal & std::lexicographical_compare vereinfachen

    Danke seldon!

    Grüssli



  • Dravere schrieb:

    seldon schrieb:

    Äh...

    #include <iostream>
    #include <vector>
    
    int main() {
      std::vector<int> a, b;
    
      std::cout << (a == b ? "gleich" : "ungleich") << std::endl;
    }
    

    😮 *nachschlägt* 😮 😮
    Ich sag es immer wieder, man lernt nie aus in C++ 😃
    geht ein paar std::equal & std::lexicographical_compare vereinfachen

    Danke seldon!

    Grüssli

    Sag bloß, das kanntest du nicht 😃

    (Ich dachte er möchte das unbedingt mir Iteratoren machen, daher meine Lösung mit equal)


Anmelden zum Antworten