Inhalt eines vectors mit integer addieren



  • Hallo zusammen

    ich sitze gerade vor dem Problem, dass ich den Inhalt meines Vectors (und zwar jedes Element) mit einem Integer addieren moechte. Der Integer ist fur alle Eintraege gleich. Gibt es da eine elegante Loesung oder muss man das mit einer Schleife loesen?

    Den Integer kann ich davor nicht draufaddieren, da der vector bereits in einer anderen Methode erstellt wird und die Addition erst in einer anderen Methode erfolgen kann.

    Danke fuer eure Hilfe!



  • Also du möchtest für jedes Element N deines Vektors quasi N = N + k haben, wobei k konstant ist? Da würde mir spontan was mit Transform einfallen:

    transform(vektor.begin(), vektor.end(), vektor.begin(),
              bind1st( plus<int>(), 12 ));
    


  • Versuch's mal mit for_each():

    //Variante a - wenn der int-Wert zur Compile-Zeit feststeht
    void add_val(int& v)
    { v+=4711; }
    
    ...
    for_each(vec.begin(),vec.end(),add_val);
    ...
    
    //Variante b - wenn der int-Wert erst zur Laufzeit ermittelt werden kann
    struct add_val : public unary_function<void,int>
    {
      add_val(int v) : op(v) {}
      void operator() (int& val)
      {val+=op;}
    private:
      int op;//Summand zum Aufaddieren
    };
    
    ...
    for_each(vec.begin(),vec.end(),add_val(4711));
    ...
    

    (das sieht zwar möglicherweise eleganter aus, führt aber intern auch wieder auf eine for-Schleife zurück)

    PS: Alternativ gibt es noch transform()

    transform(vec.begin(),vec.end(),vec.begin(),bind2nd(plus<int>,4711));
    


  • Super, vielen Dank, das hat funktioniert. Jetzt habe ich noch eine andere Frage:

    Kann ich zwei Vectoren aneinanderhaengen so dass ich am Ende nur einen habe? Also den Inhalt von 2 vectoren nacheinander in einen packen?

    Ich hab das mal so versucht:

    vector<double> vec_new(vec1);
    vec_new.insert(vec_new.begin(), vec2.begin(), vec2.end());
    

    Geht das auch noch eleganter?



  • Was hast du denn? Die Lösung ist doch schon recht elegant. Du solltest allerdings besser vec_new.end() als Zielposition angeben.

    Als Alternativen könnte ich noch anbieten, das von Hand ("for(i=0;i<v2.size();++i) v1.push_back(v2[i]);") oder über Algorithmen ("copy(v2.begin(),v2.end(),back_inserter(v1));") zu erledigen.


Anmelden zum Antworten