valarray::resize()



  • Hab eigentlich gedacht ich hätte die Frage vorhin auf der Arbeit noch abgeschickt, war aber wohl nicht:

    Laut meiner C++-Referenz sollte valarray<T>::resize(size_t n, T& c) so laufen, dass das valarray vergrößert/verkleinert wird und bei einer Vergrößerung die überzähligen neuen Elemente mit c initialisiert werden. Ich habs ausprobiert: es wurde das gesamte valarray mit diesem Wert initialisiert. Stellt sich die Frage: spinnt meine Referenz oder baut mein gcc dort Mist?

    Die andere Frage wäre dann, wie ich mein Problem implementiere: ich weiß vorher nicht genau, wie groß mein valarray am Ende sein wird, möchte es also dynamisch wachsen lassen. Gibts da sowas wie push_back?



  • hmmm. also auf vc++ 7 läuf das einwandfrei



  • hihi, hab grad folgendes gefunden:
    http://gcc.gnu.org/ml/gcc-bugs/2003-06/msg01518.html

    darin ist beschrieben, dass die gcc-version (alles überschreiben) standard-konform ist, die eine oder andere microsoft-version (nur neue elemente werden beschrieben) jedoch nicht...

    Bleibt allerdings die frage wie ich mein dynamisch wachsendes valarray hinkrieg...



  • template<typename T>
    void FixedResize(valarray<T> &varr, size_t newSize, const &T v)
    {
    #ifdef GCC
      size_t oldSize = varr.size();
      varr.resize(newSize);
      if(newSize>oldSize)
      {
         for(size_t i=oldSize;i<newSize;i++)
            varr[i] = v;
      }
    #else
      varr.resize(newSize,v);
    #endif
    }
    

    :p :p :p



  • tja, leider zwei kleine Fehlerchen drin:
    1)auch das resize ohne Füllangabe (also valarray::resize(size_t) ) überschreibt den gesamten array mit T().

    1. nicht der GCC muss gefixt werden, sondern VC6 und eventuell auch einige spätere Microsoft-Implementationen. Wie gesagt, das Verhalten des gcc IST scheinbar standardkonform...


  • o_O
    na dann eben

    void NotFixedResize(valarray<T> &varr, size_t newSize, const &T v)
    {
      valarray<T> newArray(v,newSize);
      for(size_t i=0;i<varr.size();i++)
        newArray[i] = varr[i];
      varr = newArray;
    }
    

    dann doch lieber nicht konform und kein rumkopieren... :p



  • Wusstest du schon das man std::valarray meiden soll?



  • und wieso sollte man? hat mir schon einige gute Dienste erwiesen...



  • weil für das was du vor hast ein vector besser geeignet wäre?



  • wüsste nicht, dass man bei Vektoren die ganzen arithmetischen Operatoren und Funktionen zur Verfügung hätte, die ich bei dem Prog brauche (z.B. valarray::sum(), operator+, operator/, pow(valarray, valarray), um nur mal eine Handvoll zu nennen...)
    Deswegen: Vector ist in diesem Fall alles andere als geeignet für mein Problem...



  • pumuckl schrieb:

    Bleibt allerdings die frage wie ich mein dynamisch wachsendes valarray hinkrieg...

    Selber basteln: Nimm dir einen vector als Aufbewahrungsort und implementiere die ganzen Operationen mit "for(it p=v.begin();p!=v.end();++p)" oder std::transform() 😉



  • hm dann wohl eher so, dass ichs in nem vektor aufbaue und dann in ein valarray konvertiere... das für jede Operation hin und herzukonvertiern dürfte zu viel zeit kosten...


Anmelden zum Antworten