string oder vector<char>



  • Ich glaube aus meiner Überschrift geht meine Frage schon etwas hervor: wenn ich einen char* in C++ umsetzen will empfiehlt es sich dann eher string oder eher vector<char> zu verwenden?

    Des Weiteren wäre interessant ob man string in vector<char> und umgekehrt irgendwie konvertieren kann?!

    Danke schonmal für die Hilfe 🙂



  • Nimm std::string. Mir fällt nichts ein, wo vector<char> mehr Sinn machen würde.

    Zum Kopiereren geht wohl std::copy oder einer der vector-Konstruktoren.



  • Hm ich hab mir nur gedacht, da char* bzw. char[] ja ein CharArray darstellt, dass ich vielleicht in diesem Fall lieber vector<char> verwenden sollte.

    Aber wenn string wirklich die bessere Lösung ist werde ich std::string verwenden.

    Die Frage der Konvertierung bleibt jedoch. Ich habe gerade mit der Copy-Funktion der std::string versucht den String in einen vector<char> zu kopieren, bekomme jedoch Compiler-Errors 😞





  • SeniiX schrieb:

    Die Frage der Konvertierung bleibt jedoch. Ich habe gerade mit der Copy-Funktion der std::string versucht den String in einen vector<char> zu kopieren, bekomme jedoch Compiler-Errors 😞

    Wenn du denn unbedingt einen vector<char> aus einem C-String machen willst:

    char mystring[20] = "hello world";
    std::size_t length = std::strlen(mystring);
    
    typedef std::vector<char> chvec;
    
    chvec A(mystring, mystring+length); //Range-Konstruktor
    
    chvec B(std::strlen(mystring));     //genug platz bereitstellen...
    std::copy(mystring, mystring+length, B.begin()); //und dann reinkopieren
    
    chvec C; //leeren vector erstellen...
    std::copy(mystring, mystring+length, std::back_inserter(C)); //und den String hintenan kopieren
    

    Von std::string nach vector<char> sei dann dir zur Uebung ueberlassen 😉



  • Ich danke euch vielmals 🙂



  • SeniiX schrieb:

    Ich glaube aus meiner Überschrift geht meine Frage schon etwas hervor: wenn ich einen char* in C++ umsetzen will empfiehlt es sich dann eher string oder eher vector<char> zu verwenden?

    Des Weiteren wäre interessant ob man string in vector<char> und umgekehrt irgendwie konvertieren kann?!

    Danke schonmal für die Hilfe 🙂

    vector<char> verwendet man auch, allerdings wenn, dann in kontexten, wo eine schnittstelle char* erwartet. einen std::string kann man nämlich nicht (ohne weiteres) als char* verwenden (wohl aber als const char* ).



  • queer_boy schrieb:

    vector<char> verwendet man auch, allerdings wenn, dann in kontexten, wo eine schnittstelle char* erwartet. einen std::string kann man nämlich nicht (ohne weiteres) als char* verwenden (wohl aber als const char* ).

    Ja, darum gings mir eigentlich, weil ich gerade eine Library für eine SNMP-Kommunikation schreiben muss und dabei eine Art Vorlage in Java habe. Und der Datentyp byte[] wäre in ANSI C ja char*. Es ging mir eigentlich darum ob ich in diesem Kontext std::string verwenden kann.



  • Ich würde in diesem Kontext ein std::vector<unsigned char> verwenden
    (byte entspricht unsigned char, nicht signed char)

    Wenns allerdings um c- strings (mit 0 terminierung) geht würde ich std::string verwenden.

    Gruss simon



  • Hmja, so hatte ich es anfangs auch vor, bis dann auf einmal byte[] in string und umgekehrt konvertiert wurde und ich nicht wusste, wie ich einen vector<char> in std::string konvertiere.

    Aber dieses Problem wurde sowieso bereits gelöst 🙂



  • Ich habe jetzt wie folgt std::string in std::vector<char> konvertiert:

    std::vector<unsigned char> stringToCharvector(std::string string_dummy)
    {
    	std::size_t length = string_dummy.size();;
    	std::vector<unsigned char> chvec;
    
    	for(int i=0; i<length; i++) {
    		chvec.push_back(string_dummy[i]);
    	}
    
    	return chvec;
    }
    

    Kann mir bitte noch schnell jemand sagen, ob das so richtig ist? Funktionieren tut diese Funktion. Allerdings wäre interessant, ob sie in dieser Form Risiken o. Ä. hat?!



  • 1. Übergib den std::string per const &.
    2. Benutze doch std::copy

    // std::copy ist im header <algorithm>
    std::vector<unsigned char> stringToCharvector(const std::string& s)
    {
       // So wird das terminierende 0 nicht mitkopiert !
       std::vector<unsigned char> v(s.size());
       std::copy(s.begin(), s.end(), v.begin());
       return v;
    }
    

    Simon



  • Ich denke, so würde es auch gehen:

    std::vector<std::string::value_type> stringToCharvector( const std::string& s )
    {
       return std::vector<std::string::value_type>( s.begin(), s.end() );
    }
    

Anmelden zum Antworten