STL + Wörter sortiert in Liste einfügen
-
Hallo zusammen,
ich stelle mir grad folgende Frage. Ein Programm, welches eine Reihe von Wörtern einliest und diese dann sortiert in eine verkettete Liste einliest, würde unter C ja doch so einigen Aufwand bedeuten, man müsste erst die Verwaltung der Liste erstellen, das sortierte einfügen und sich was überlegen, wie man die Namen in beliebiger Länge speichert. Ich beherrsche in C++ die Grundlegenden Techniken, bin auch mit OO vertraut, jedoch eben nicht mit der STL. Alles was ich darüber weiß, ist quasi das, was ich mir hier so durch mitlesen angeeignet habe. Meines erachtens dürfte das obige Problem dadurch aber mehr oder minder ein Dreizeiler werden. Daher möchte ich einerseits diesen Dreizeilen wissen, und um den hinzukriegen irgendwo ne gute Doku, wo ich eben genau auf das oben beschriebene Wissen aufbauend die einzelnen Funktionen der STL kennenlernen. Hat da jemand Tipps?
Viele Grüße,
Mata
-
naja, ein dreizeiler ist es nicht ganz.
#include <list>//liste #include <string>//klasse für strings #include <iostream>//eingabe/ausgabe using namespace std; int main(){ list<string> words; string word; while(word!="end"){ cin>>word; if(word!="end"){//nur anhängen, wenn word nicht end ist, wir wollen das ja nicht in der liste drin stehen haben words.push_back(word); } } words.sort(); for(list<string>::iterator pos=words.begin();pos!=words.end();++pos){ cout<<*pos<<"\n"; } }
die eingabe geht bestimmt einfacher, hatte aber atm keine lust, mein gehirn wieder anzuschalten.
-
Immernoch kein 3 Zeiler, aber schon etwas schlanker
while((cin >> word),word!="end") words.push_back(word);
-
hmmm...die Lösung ist gut
-
Hallo,
wozu dieses "end"? Warum nicht einfach eof als Endekennung?
Wenn's keine Liste sein muss:#include <string> #include <set> #include <iterator> #include <iostream> #include <algorithm> using namespace std; int main() { set<string> words((istream_iterator<string>(cin)), istream_iterator<string>()); copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n")); }
Alternativ:
#include <string> #include <list> #include <iterator> #include <iostream> #include <algorithm> using namespace std; int main() { list<string> words((istream_iterator<string>(cin)), istream_iterator<string>()); words.sort(); copy(words.begin(), words.end(), ostream_iterator<string>(cout, "\n")); }
-
ein "end" kann sichd er mensch viel besser merken, als irgendsoeine komische tastenkombination wie eof
-
otze schrieb:
ein "end" kann sichd er mensch viel besser merken, als irgendsoeine komische tastenkombination wie eof
Das Programm wird dadurch aber inflexibel. Verwende ich ganz normal eof, kann ich das Programm viel leichter "Unix-artig" mit anderen Programmen verknüpfen.
Und btw: Warum "end" und nicht "END" oder "ende" oder "stop" oder "schluss jetzt"?
Da schreibe ich mir doch lieber noch ein kleines Wrapper-Skript drum rum.
-
SeppSchrot schrieb:
Immernoch kein 3 Zeiler, aber schon etwas schlanker
while((cin >> word),word!="end") words.push_back(word);
Besser wäre: while((cin >> word) && word!="end")
Denn so prüfst du den Inhalt von word wirklich nur dann, wenn auch ein Wort gelesen wurde.
-
hallo!!
weiß zufälliger weise jemand, ob oder wie man beim erstellen von Datein variable mit in den Dateinamen schreibt?
ofstream out("hallo%d.txt",a);
fuznt net!
Da erhalt ich nur eine Datei mit dem Namen: hallo%d.txt!
-
würde mich wundern, wenn das funzen würde, immerhin sind wir hier bei C++ und nicht bei C,dh sprintf artige strukturen gibt es nicht. setz dir den string am besten aus einzelnens trings via std::string oder ähnlichem zusammen.
@Hume sicher hast du recht, mir lags gestern nacht aber eher daran, ein programm zu schreiben, was man auch ohne probleme schnell ausprobieren kann :D.
naja, du hast halt den 3zeiler nachgeliefert.gott, ich brauchd och endlich mal ein richtig gutes buch über die stl
-
verdammt also weisst du´s auch net!
Ich versuch halt mit ner Schleife durchnummerierte Dateien zu erstellen!
-
verdammt also weisst du´s auch net!
Ich versuch halt mit ner Schleife durchnummerierte Dateien zu erstellen!
-
@Hume
habe versucht, dein beispiel mit VC6 zu kompilieren, das geht aber nicht . der Compiler stört sich an dem 'cin' und erkennt die deklaration von words nicht. was könnte man noch verbessern?list<string> words((istream_iterator<string>(cin)), istream_iterator<string>());
: error C2061: Syntaxfehler : Bezeichner 'cin'
: error C2066: Typumwandlung in Funktionstyp nicht erlaubt
: error C2065: 'words' : nichtdeklarierter Bezeichnerthx arni
-
benutz einen moderneren compiler, der vc++ ist in der hinsicht schon zu halt.
google mal nach mingw oder Dev-C++
-
arni schrieb:
@Hume
habe versucht, dein beispiel mit VC6 zu kompilieren, das geht aber nicht . der Compiler stört sich an dem 'cin' und erkennt die deklaration von words nicht.Ersetz mal das:
list<string> words((), istream_iterator<string>());
durch die explizite Version:
istream_iterator<string> beg(cin), end; list<string> words(beg, end);
Falls dein Compiler das auch nicht kann (weil der list-Ctor fälschlicherweise kein passenden Template-Ctor hat), dann so:
istream_iterator<string> beg(cin), end; list<string> words; copy(beg, end, back_inserter(words);