atof und vector<string>



  • carmen schrieb:

    und wie würde ich von vector<string> s die Elemente 20 bis 50 in vector<float> x kopieren???

    indem du den richtigen Start- und Endindex für deine Schleife verwendest:

    for(int i=20;i<=50;++i)
    {
      float f=atof(s[i].c_str());
      x.push_back(f);
    }
    

    (eventuell kannst du auch "x[i]=f;" verwenden, damit überschreibst du die Elemente 20 bis 50 von x mit den konvertierten Strings)



  • Ich war nicht klar... SCUZI
    Ich reformuliere:

    std::copy(vector<string>::iterator s[20].iterator,s[50].iterator,back_inserter(x));
    

    Wie definiere ich richtig ein Iterator auf s[20], sodass ich copy benutzen kann??



  • s.begin() + n
    


  • Sehr schön!

    std::copy(s.begin()+idx_channel[0],s.begin()+idx_channel[1],back_inserter(x));
    

    aber leider fuktioniert nicht

    c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\xutility(1022): error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::allocator<_Ty>::value_type' (or there is no acceptable conversion)
    with
    [
    _Ty=std::string
    ]



  • ist x ein std::vector<float>? Dann wirds wohl nicht gehen.



  • Ja, bei einem "blanken" copy lässt du auch die Umwandlung unter den Tisch fallen - du brauchst transform:

    std::transform(s.begin()+idx_channel[0],s.begin()+idx_channel[1],back_inserter(x),atof);
    


  • Geht auch nicht!

    c:\Programme\Microsoft Visual Studio .NET 2003\Vc7\include\algorithm(388): error C2664: 'double (const char *)' : cannot convert parameter 1 from 'std::allocator<_Ty>::value_type' to 'const char *'
    with
    [
    _Ty=std::string
    ]



  • Warum benutzt du nicht die for-Schleife?



  • Ich wollte nur elleganter schreiben...und die Algorithmen benutzen



  • Dann könntest du statt atof eine der C++-typischeren Umwandlungsmethoden (z.B. über stringstream's oder per boost::lexical_cast) verwenden - schau mal in die FAQ, was es da gibt.

    oder du schreibst dir eine Hilfsfunktion:

    inline float stof(const string& in)
    { return atof(in.c_str()); }
    
    transform(s.begin(),s.end(),back_inserter(x),stof);
    

    PS: eine weitere Alternative wäre es, den richtigen Funktor für transform() aus compose, mem_fun etc zusammenzubauen.



  • YUHUUUU!! Das funktioniert...

    Für die Alternative mit Funktoren bin ich nicht so weit...

    Auf jeden Fall danke für die schnellen Antworten...Eine sehr effektive Hilfe...


Anmelden zum Antworten