Frage zu "vector"



  • beschäftige mich erst seit sehr kurzem mit vector und so (eigtl erst seit gestern ;))

    Code sieht so aus:

    //vec:
      vector<int> vec;
      // wird aufgefüllt ....
    
      vector<int> zvec(vec);
    
      int actual = 0;
    
      for(vector<int>::const_iterator j=vec.begin();j!=vec.end(); ++j) {
        if(*j<actual) {
          zvec.insert(j, actual);
        } 
      }
    

    und dann funktioniert das insert net, weil, da ein iterator und net const_iterator verlangt ist, wenn ich aber in der for-Schleife, dass const_iterator durch iterator erstze funktioniert es net :-(, weil das vec.begin() und vec.begin() ja vom Typ const_iterator sind.
    Wie krieg ich, dass hin, dass an die stelle von *j im anderen vector die variable actual hingeschrieben wird?



  • ich seh keinen Grund warum das nicht ohne const gehen sollte:

    for( vector<int>::iterator itr = vec.begin();itr!=vec.end(); ++itr) {
        if(*itr<actual) {
          zvec.insert(itr, actual);
        }
      }
    

    Ich weiß ja nicht genau was du vor hast, aber wie wärs denn damit:

    for( vector<int>::iterator itr = zvec.begin();itr!=zvec.end(); ++itr) {
        if(*itr<actual) {
          *itr = actual;
        }
      }
    


  • wolfyy schrieb:

    ich seh keinen Grund warum das nicht ohne const gehen sollte:

    for( vector<int>::iterator itr = vec.begin();itr!=vec.end(); ++itr) {
        if(*itr<actual) {
          zvec.insert(itr, actual);
        }
      }
    

    weil vec.begin() und vec.end() vom Typ vector<int>::const_iterator sind und nicht vom Typ vector<int>::iterator

    Ich weiß ja nicht genau was du vor hast, aber wie wärs denn damit:

    for( vector<int>::iterator itr = zvec.begin();itr!=zvec.end(); ++itr) {
        if(*itr<actual) {
          *itr = actual;
        }
      }
    

    Logik passt schon 😉

    habs glaub geloest:

    for(vector<int>::size_type st = 0;st<vec.size(); ++st) {
        if(vec[st]<actual)
          retvec.at(st) = actual;
      }
    


  • Checker&Murckser schrieb:

    //vec:
      vector<int> vec;
      // wird aufgefüllt ....
    
      vector<int> zvec(vec);
     
      int actual = 0;
      
      for(vector<int>::const_iterator j=vec.begin();j!=vec.end(); ++j) {
        if(*j<actual) {
          zvec.insert(j, actual);
        } 
      }
    

    *Autsch*

    Dein j "zeigt" auf eine Positon im vec-vector. Dann kannst du nicht bei zvec-insert diese Position angeben...



  • aber zvec wurde doch mit vec initialisiert, also müsste das doch gehen, oder?



  • Checker&Murckser schrieb:

    aber zvec wurde doch mit vec initialisiert, also müsste das doch gehen, oder?

    Ja aber zvec ist nen eigenständiger Vector mit nur den Werten aus vec. Ich würds jedenfalls nicht herausfordern.

    Da ja in zvec das selbe wie vec steht kannst du doch einfach so machen:

    for(vector<int>::iterator it=zvec.begin();it!=zvec.end(); ++it) 
        if(*it<actual) *it = actual;
    


  • Für begin() und end() gibt es jeweils Überladungen die einen const_iterator oder einen iterator zurückgeben können. Je nach Kontext.

    Generell kann man Iteratoren verschiedener Objekte nicht mischen, auch wenn der Typ identisch ist. Im konkreten Fall des vector ist der Iterator in den allermeisten Implementierungen sogr nichts anderes als ein Zeiger auf das jeweilige Element, und versuch mal die Adresse eines Elements in zvec im Vector vec wiederzufinden 😉



  • okok, bin halt unerfahren, was vector list deque etc angeht, muss noch viel lernen 😉 daher das Murckser in meinem namen 🙂

    Danke für eure Antworten



  • vec und zvec sind eigenständige Container. Der iterator verweist an irgendeine Stelle in vec. Wenn ich jetzt aber zvec sage, füg mal etwas an der Position ein, wo der Iterator hinverweist und der Iterator verweist gar nicht an eine stelle innerhalb von zvec, dann ist das nicht gut.

    Und wegen dem const_iterator oder nicht: vec ist nicht const. also geibt begin() und end() auch einen iterator und keinen const_iterator zurück!


Anmelden zum Antworten