vektor<convertprobleme>
-
Hallo liebe Programmierer,
Ich konvertiere zu Übungszwecken alte Programme, die Ich in C geschrieben habe in C++ Bei den Vektoren die analog zu arrays in c++ arbeiten bin Ich auf ein Problem gestoßen. Der Compiler macht nicht was er soll : unterhalb ist das in C geschriebene Programm, dass einwandfrei läuft.#include<iostream> #include<vector> #include<string> using namespace std; //buchstabenvector--->char/string int main(){ vector <char> buchstabenfeld; vector <char> kontrollfeld; int i=0,veraenderungszaehler=0; cout<<"Bitte geben Sie ein Wort bis 20 Buchstaben ein "; cin>>buchstabenfeld; cout<<"Das eingegebene Wort ist \n"<<buchstabenfeld.at(i)<<endl; return 0; }Hier dass Original welches Ich in C geschrieben habe:
/*int main(void){ char buchstabenfeld[20]; char kontrollfeld[2]; int i,veraenderungszaehler=0; printf("Bitte geben Sie ein Wort bis 20 Buchstaben ein "); scanf("%s",buchstabenfeld); printf("Das eingegebene Wort ist %s\n",buchstabenfeld); for(i=0;i<20;i++) { kontrollfeld[0]=buchstabenfeld[i]; kontrollfeld[1]=buchstabenfeld[i+1]; if (kontrollfeld[0] == 'a' && kontrollfeld[1] == 'u') {buchstabenfeld[i]='e';buchstabenfeld[i+1]='i';veraenderungszaehler+=2;} if (kontrollfeld[0] == 'A' && kontrollfeld[1] == 'u') {buchstabenfeld[i]='E',buchstabenfeld[i+1]='i';veraenderungszaehler+=2;} if (kontrollfeld[0] == 'a' && kontrollfeld[1] == 'U') {buchstabenfeld[i]='e',buchstabenfeld[i+1]='l';veraenderungszaehler+=2;} if (kontrollfeld[0] == 'A' && kontrollfeld[1] == 'U') {buchstabenfeld[i]='E',buchstabenfeld[i+1]='L';veraenderungszaehler+=2;} } printf("Das gewandelte Wort lautet auf %s\n\n",buchstabenfeld); printf("Es wurden %i Veraenderungen an der Zeichenkette vorgenommen",veraenderungszaehler); system("pause"); }*/g++ buchstabenvector.cpp buchstabenvector.cpp: In function ‘int main()’: buchstabenvector.cpp:13:36: error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘std::vector<char>’) cout<<"Das eingegebene Wort ist \n"<<buchstabenfeld<<endl; ^ buchstabenvector.cpp:13:36: note: candidates are: In file included from /usr/include/c++/4.8/iostream:39:0, from buchstabenvector.cpp:1: /usr/include/c++/4.8/ostream:108:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ostream_type& (*)(std::basic_ostream<_CharT, _Traits>::__ostream_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>] operator<<(__ostream_type& (*__pf)(__ostream_type&)) ^ /usr/include/c++/4.8/ostream:108:7: note: no known conversion for argument 1 from ‘std::vector<char>’ to ‘std::basic_ostream<char>::__ostream_type& (*)(std::basic_ostream<char>::__ostream_type&) {aka std::basic_ostream<char>& (*)(std::basic_ostream<char>&)}’ /usr/include/c++/4.8/ostream:117:7: note: std::basic_ostream<_CharT, _Traits>::__ostream_type& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>::__ios_type& (*)(std::basic_ostream<_CharT, _Traits>::__ios_type&)) [with _CharT = char; _Traits = std::char_traits<char>; std::basic_ostream<_CharT, _Traits>::__ostream_type = std::basic_ostream<char>; std::basic_ostream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] operator<<(__ios_type& (*__pf)(__ios_type&))Auf den Versuch das untere Programm als Vektor in c++ umzuschreiben bekomme Ich diese Fehlermeldung : wo ist das Problem bzw. gegen was verstößt das ganze ?
Mit strings geht das ganze einfacher, aber Ich wollte es halt mit dem Datentyp vector ausprobieren ?
-
Nimm std::string für Zeichenketten.
-
ok...
-
Der Vollständigkeit halber: Die Fehlermeldung besagt, dass der "
<<"-Operator vonstd::coutfür den Datentypstd::vector<char>nicht definiert ist.Es empfiehlt sich wie Nathan bereits erwähnt hat,
std::stringzu verwenden. Wenn du es aber dennoch mitstd::vector<char>arbeiten möchtest, bleibt dir nichts anderes übrig als fürcout, bzw. für einen allgemeinenstd::ostreamden "<<"-Operator für Vektoren selbst zu definieren.
Das kann z.B. so aussehen:std::ostream& operator<<(std::ostream& out, const std::vector<char>& v) { for (auto c : v) out << c; return out; };Damit kannst du dann den
std::vectordirekt viacoutausgeben.Gruss,
Finnegan
-
Danke!Jetzt wird's klarer.
-
Finnegan schrieb:
Wenn du es aber dennoch mit
std::vector<char>arbeiten möchtest, bleibt dir nichts anderes übrig als fürcout, bzw. für einen allgemeinenstd::ostreamden "<<"-Operator für Vektoren selbst zu definieren.Man kann auch einfach
push_back('\0')und dann nen Zeiger auf das erste Element rausschiften.
-
hustbaer schrieb:
Finnegan schrieb:
Wenn du es aber dennoch mit
std::vector<char>arbeiten möchtest, bleibt dir nichts anderes übrig als fürcout, bzw. für einen allgemeinenstd::ostreamden "<<"-Operator für Vektoren selbst zu definieren.Man kann auch einfach
push_back('\0')und dann nen Zeiger auf das erste Element rausschiften.hehe, jo, ich gebe zu das war etwas unglücklich formuliert. Gerade in der Programmierung bleibt einem eigentlich so gut wie immer auch noch "etwas anderes übrig"
... obwohl ich zugeben muss, dass mir Strings, welche ihre Länge explizit mitführen besser gefallen (und der Vektor mit dem 0-char diesbezüglich etwas redundant ist): Einfacher zu implementierende String-Manipulationen, Längenbestimmung ohne den ganzen String anfassen zu müssen, etc... aber wem erzähl' ich das 
Finnegan