Diskussion:C++-Standardbibliothek/Archiv/1
Standardbibliothek der Templates?
Poldi: Re: std::string IST NICHT in der STL! Antwort: Eigentlich ja, ABER:
- Der Basistyp für std::string ist
template<class Char, class Char_Traits =Traits<Char>, Allocator alloc = std::Allocator<Char> > class basic_string<>
Wie deutlich zu sehen ist, ist basic_string ein template.
Der eigentliche typ std::string ist wie folgt definiert:
typedef basic_string<char> std::string.
Unter meinem Linux kann man dies in der Header-Datei nachsehen.
Desweiteren gibt es auch noch einen anderen string-typedef:
typedef basic_string<wchar_t> std::wstring.
Summa summarum:
string ist ein typedef-ned template, und ist in der Standardbibliothek. Wie nennt man noch gleich die Standardbibliothek der Templates ;-) ??? --modified by old.cpp 15:57, 3. Feb 2005 (CET)
- Nein, das hat damit nichts zu tun. Und auch basic_string<> gehört nicht zur STL. Ich empfehle den Artikel Standard Template Library. Poldi 16:47, 3. Feb 2005 (CET)
re-re-re:
"Container (Behälterklassen) sind Datenstrukturen, die aus einer Anzahl verschiedener Objekte des selben Datentyps bestehen." (Zitat aus Deiner Empfehlung.)
Wenn Du gerade das Buch "Die C++-Programmiersprache", 4. aktual. Auflage zur Hand hast, empfehle ich den Abschnitt über Template-Spezialisierung.
So ist etwa eine Spezialisierung von std::vector<> auf std::vector<void*> für allgemeine Zeiger möglich.
Im Prinzip ist ein std::basic_string nichts anderes als ein Container für Zeichentypen (man könnte auch integer, floats, oder Zeiger nutzen, aber dafür eignet sich eher der std::vector<>). So ist auch folgendes denkbar (nur grob umrissen):
//Unicode-zeichen class UniChar; template class uni_traits : public std::char_traits<> ; template class uni_Alloc : public std::Allocator<> ; typedef std::basic_string<UniChar, uni_traits, uni_Alloc> unistring;
Wie schon in meiner ersten Antwort gesagt, ist der std::string kein STL im eigentlichen Sinne, man kann es aber sehrwohl so betrachten. Auch ist der Artikel STL (noch) nicht vollständig. Es fehlen noch multi_map und multi_set, die in <map> und <set> definiert sind (Erledigt). modified by old.cpp 17:41, 3. Feb 2005 (CET).
- Hm, was willst du jetzt denn sagen? Was ist deine Schlussfolgerung? :-) Poldi 12:22, 4. Feb 2005 (CET)
- Ganz einfach: Einen String könnte man als einen auf Zeichen spezialisierten Container betrachten.--modified by old.cpp 16:10, 4. Feb 2005 (CET)
- 1.: Bloß weil etwas ein Container ist, heißt es nicht, dass es zur STL gehört. std::string gehört nicht zur STL!
- 2.: "könnte man betrachten als" gibt es nicht. Was ein Container ist, ist genau definiert (und std::string ist keiner!) Poldi 20:19, 4. Feb 2005 (CET)
Neu angelegter Artikel
Als du den Artikel angelegt hast, hast du am Ende {{stub}} eingefügt. Warum?
- Ganz einfach : Der Artikel bestand nur aus einem Satz, daher der {{stub}}.
Der Artikel befindet sich gerade vor einer immmensen Ausdehnung (Inflation).
- Du scheinst dich ja auszukennen. Ganz sicher, dass du erst neu bist bei Wikipedia? ;-) Poldi 20:19, 4. Feb 2005 (CET)
FRAGE an ALLE: Hat jemand ein FREIES Inheritance-/Usage-Diagramm vom std::basic_ios?? Wenn ja, bitte hier den Link angeben. Wenn nicht, hab' ich eins bis morgen (selbst erstellt).--modified by old.cpp 16:16, 4. Feb 2005 (CET)
- Danke für deinen Einsatz. Aber siehe bitte meinen Kommentar unter "Anregung und Kritik"! Poldi 20:19, 4. Feb 2005 (CET)
Anregung und Kritik
Wie ausführlich soll der Artikel werden: alles angeben, nur die wichtigsten Sachen, Sachen bei denen Probleme während der benutzung auftreten könn(t)en?
Vorschlag:
- Am häufigsten Genutztes ausführlich
- Über selten Genutztes immernoch ein Überblick
- Bei Funktionen, Methoden, Klassen, Templates, bei denen Probleme auftreten, mindestens ein ausführliches Beispiel.
- Bevor du dich voll reinhängst, sei dir gesagt, dass es folgenden Link gibt, der auch im Artikel referenziert ist: http://www.cppreference.com/ Dort ist die Standardbibliothek ausführlich beschrieben.
Wenn du meinst, das reicht nicht (kann ja sein :-), dann ist vielleicht http://de.wikibooks.org ein geeigneterer Ort.
Hier in Wikipedia würde ich eher versuchen einen Überblick zu geben, und eventuell Entstehung und Hintergründe zu beleuchten. Poldi 20:12, 4. Feb 2005 (CET)
- Diese Seite wird abgeändert: Allgemeiner Überblick über die Stdlib, Link auf http://de.wikibooks.org, dort möglw. Buch darüber. Poldi: Link auf Cppref.com ganz nett, aber schau Dir erst mal das Buch, daß am Ende dieses Artikels genannt wird, an.--modified by old.cpp 17:28, 6. Feb 2005 (CET)
- Die Definition zu Containern, und auch die Begründung, warum std::string kein Container ist, findest du in dem genannten Buch. Poldi 18:59, 6. Feb 2005 (CET)
- Hinweis: Selbst die Macher der ISO/IEC-STL sind sich nicht ganz sicher: auf SGI Download ist der std::string als Teil der STL (so muss man es wohl sehen) aufgeführt, auf SGI Introduction to the STL hingegen nicht...--modified by old.cpp 21:37, 8. Feb 2005 (CET)
- Die Definition zu Containern, und auch die Begründung, warum std::string kein Container ist, findest du in dem genannten Buch. Poldi 18:59, 6. Feb 2005 (CET)
- Diese Seite wird abgeändert: Allgemeiner Überblick über die Stdlib, Link auf http://de.wikibooks.org, dort möglw. Buch darüber. Poldi: Link auf Cppref.com ganz nett, aber schau Dir erst mal das Buch, daß am Ende dieses Artikels genannt wird, an.--modified by old.cpp 17:28, 6. Feb 2005 (CET)
"Schlechte Links"???
Zitat: "Weblink entfernt, da noch in der Entstehung. Nur hervorragende Links bitte!"
Frage: Wenn externe auf wikipedia verlinken, sollten diese dann ebenfalls ihre Links entfernen, schließlich ist auch WP noch nicht vollständig?? Ein Projekt wächst gerade durch die Mitarbeit - oder?--modified by old.cpp 12:45, 2. Mär 2005 (CET)
- Je mehr schlechte Artikel wir haben, umso weniger "Externe" werden ihre Seiten mit Wikipedia verlinken. Willst du das?
Links auf unfertige Projekte haben im Artikel nichts zu suchen. Links auf Schwesterprojekte könnten evtl. auf der Diskussionsseite stehen. --Hades 21:22, 2. Mär 2005 (CET)
STL und C++ Standard Bibliothek
Korrigiert mich bitte, wenn ich falsch liege, aber ich glaube, dass die STL zwar von C++ unabhängig entwickelt wurde, aber ihre Beschreibung 1995 als Forderung an C++ in die Kapitel 23 (Container) 24 (Iterators) und 20.3 (Function objects = Functors) einging. Damit ist die STL in diesen Kapiteln praktisch enthalten und auch in jedem konformen C++ Compiler.
Und die (grobe) Einteilung der C++ Bibliothek in
- 1 C-Bibliothek (cmath, ctime,...)
- 2 C++ Bibliothek (iostream, string...)
- 3 STL (20.3, 23, 24)
halte ich eigentlich auch für korrekt. Die Teile aus Punkt 2 sind im Licht der STL überarbeitet/neu definiert worden und enthalten Iteratoren und Funktoren.
Und etwa so wollte ich das ich diesem (wieder weitgehend gelöschten) Artikel beschreiben. Ich wollte wenn ich Zeit habe auch einfache Beispiel einfügen.
brf
Und gerade habe ich in der englischen Version nachgeschaut, und dort steht es ähnlich:
C++ library
The C++ standard library incorporates the C standard library with some small modifications to make it work better with the C++ language. Another large part of the C++ library is based on the Standard Template Library (STL). This provides such useful tools as containers (for example vectors and lists) and iterators (generalized pointers) to provide these containers with array-like access.
siehe http://en.wikipedia.org/wiki/C_Plus_Plus
brf
- Hast du den Artikel zur STL gelesen? --80.136.225.70 20:18, 16. Jun 2005 (CEST)
Ja. Ich habe die Seite angefangen, weil der Link auf der C++ Seite tot war. Dann ist mir aufgefallen, dass dieser Strikel (STL) existiert und ich habe überlegt, ob man beides (STL und C++ SL - Standard Library) zusammen erläutert. Mein Ergebnis war, dass man den Unterschied auf zwei Seiten herausarbeiten sollte. Und dass dieser Artikel (C++SL) die C++ Lib beschreiben sollte. Die Beziheung zur STL kann in den anderen Artikel (wohin Du es ja auch verschoben hast)
brf
- Ja, das war die Idee. Ein Problem bei der STL ist, dass man Verschiedenes darunter versteht. Es gibt keine genaue Definition.
- Für die Darstellung der Standardbibliothek im Artikel fände ich eine feingliedrigere Aufteilung sinnvoller.
- Noch einige Tipps:
- Denk daran, dass der Artikel für Laien verständlich sein soll.
- Schreib nie und unter keinen Umständen Sachen, die du nur vermutest. (Der Satz "Die C-Bibliothek wurde zunächst in C++ integriert, damit man in den ersten Sprachversionen überhaupt eine Bibliothek zur Verfügung hat." geht stark in Richtung einer Vermutung. Oder kannst du das irgendwie belegen?) Wenn du dir in einem Punkt nicht sicher bist, dann musst du recherchieren. Der Aufwand für die Recherche kann der Hauptaufwand beim Schreiben eines Artikels sein.
- Verwende zum Recherchieren nach Möglichkeit Primärquellen.
- Ansonsten empfehle ich noch
Es ist mehr als eine Vermutung. Ich verfolge die Sprache C++ seit 1985. Und in C++ with classes wurde (nach meiner Erinnerung) sogar noch printf benutzt. Aber ich habe es nicht wirklich aktuell recherchiert. Da hast Du recht.
Feinere Untergliederung?? Da kann ich mir eigentlich nur die Unterteilung des Standards Kap 19 - Kap 27 vorstellen. Und über die dort gewählte Gliederung und Reihenfolge kann man zumindestens diskutieren. Ich halte sie nicht für besonders gut. Und es wird dann eben nicht mehr ein Artikel für Laien.
Wie kann man dieses Thema überhaupt gliedern?
Mein Vorschlag gliedert nach der Entwicklung:
1. Herkunft C (cmath, cstdlib...) 2. Neuentwickelt für C++ (iostream, exception ...) 3. Herkunft aus der STL (container, iterator, functor...)
Thematisch ist die Gliederung ja schon in C vergurkt (Mathematisches ist in math.h und in stdlib.h, Bsp. abs (i)) und es haben sich viele an einer solchen Gliederung erfolglos versucht. Und thematisch ergibt es aun unüberichtliches Chaos, in dem bei jedem Punkt sehr viele Bibliotheken erwähnt werden. Die besseren C-Lehrbücher verwendet einfach die Gliederung des Standards. Mit C++ verschärft sich eine derartige Gliederung noch, denn Iteratoren sind eben auch in allen Bibliotheksteilen enthalten.
Und ich wollte meinen Vorschlag ja noch verfeinern. Aber das geht (sorgfältig) nur in kleineren Schritten.
brf
- meine Antworten:
- Ich verfolge die Sprache C++ seit 1985. Auf welche Informationsquellen hast du dabei bisher zurückgegriffen?
- Wie kann man dieses Thema überhaupt gliedern? Inhaltlich. Nicht historisch oder nach der Entwicklung! Wie du darauf kommst, dass es eine Hilfe sein soll, zu wissen, was aus der STL kommt, ist mir nicht ganz klar. Da die STL nicht in der Standardbibliothek enthalten ist, ist das auch gar nicht möglich. Was ist denn die STL? Es gibt ja nicht einmal eine Definition dafür (s. Artikel STL).
- Bitte aufpassen, dass kein Lehrgang daraus wird. Auch eine Beschreibung in Form einer Liste ist in Wikipedia im Allgemeinen nicht erwünscht.
- noch ein paar Anmerkungen zum Artikel:
- Die C++ Standardbibliothek besteht aus der speziell für C++ entwickelten Version der klassischen C-Bibliotheken, z.B. iostream und string und dem kompletten Bestand der C-Bibliothek Wer keine Vorkenntnisse in C hat, ist hier überfordert, und für den Experten ist es keine interessante Information.
- Im C++-Standard wurden die Namen der C-Bibliotheken geändert, um Namenskollisionen mit den neuen C++-Bibliotheken zu vermeiden. Das ist nicht der Grund. – Die C-Bibliotheken unter ihren alten Namen gibt es weiterhin. Im Wesentlichen unterscheiden sich die Varianten mit vorangestelltem "c" dadurch, dass sie im Namensraum std leben.
- Du hast sehr oft auf den Artikel C++ verlinkt. Das ist eigentlich unüblich. Normalerweise wird nur das erste Vorkommen verlinkt.
- bis bald ... 19:18, 20. Jun 2005 (CEST)
Eine Aufzählung ist mir zu mühsam und sicher nicht notwendig. Aber ich besitze (und habe gelesen!) die Ausgaben 1-3 von Stroustrup, C++; den ARM (Annotated Ref Man); den ISO-Standard von 1997 und diverse gute und schlechte, dt und en Lehrbücher (Eggink, Breymann, Wieland, Klöppel, Eckel, Spuler, Wang, Cline); Bücher die C++ verwenden (Num Recipes, Sedgewick); Internetliteratur (Brokken, Eckel, Schmaranz, Letschert, Mohr, Müller, Grabert); kritische Diskussionen (C++??) Reicht das???
Wer keine Vorkenntnisse in C hat, ist mit C++ eigentlich doch sowieso überfordert, oder? Aber ein Lexikonartikel kann kein Lehrbuch sein, sondern immer nur korrekte sachliche Fakten übersichtlich aufzählen. Profitieren kann ein C-Programmierer, der etwas über C++ lesen will.
cstdlib: Da hast Du mit den namespaces recht und ich liege trotzdem nicht falsch. Aber ich weiß es nicht, denn ich war in den ISO-Gremien nicht dabei und kenne auch niemanden. Ich denke, dass es mindestens bei string erwünscht war, dass die C++ String <string> und die C-Strings <cstring> heißen. Die alten Namen wie <string.h> sind wie so vieles in C++ einfach nur historischer Ballast.
Schau mal die englischen und französischen Versionen dieses Artikels an. Ich habe nicht abgeschrieben sondern erst im Rahmen unserer Diskussion hineingeschaut. Und sie sind meinem Entwurf verblüffend ähnlich, So falsch kann ich also nicht liegen.
brf
- Reicht das? – Weiß nicht. Schaun wir mal. :) ("Design und Entwicklung" von Stroustrup ist noch zu empfehlen.)
- Wer keine Vorkenntnisse in C hat, ist mit C++ eigentlich doch sowieso überfordert, oder? – Es gab vor Kurzem eine Diskussion zu diesem Thema in comp.lang.c++.moderated, und im Tenor wurde das Gegenteil vertreten. Zumindest sollten wir versuchen, nicht zu viel Vorkenntnisse vorauszusetzen.
- Schau mal die englischen und französischen Versionen dieses Artikels an. – Das Problem beim Thema Programmierung, insbesondere bei C++, ist der erschreckend hohe Anteil an schlechten sowie schlicht falschen Informationen. Auch die C++-Literatur ist unglaublich schlecht. Leider wird vieles einfach repliziert. Deshalb mein Verweis auf Primärquellen. Den französischen Artikel finde ich zu oberflächlich, der englische ist ok. Der Hinweis auf die C-Bibliothek gehört in den Artikel, das ist schon richtig. Man sollte es aber auch nicht überbetonen, oder die gesamte Aufteilung zu sehr daran festmachen.
- ein Lexikonartikel kann kein Lehrbuch sein, sondern immer nur korrekte sachliche Fakten übersichtlich aufzählen – Sehe ich auch so. Ich meine, wir könnten uns für den Anfang am englischen Artikel orientieren, sollten aber nicht daran kleben bleiben. Die Aufzählung der Header würde ich in jedem Fall nicht übernehmen.
- 19:11, 21. Jun 2005 (CEST)
Ich denke, hier könnten wir uns langsam treffen: im englischen Artikel bleibt jedoch nur der magere erste Absatz, wenn man die Header weglässt (was ich wie Du tun würde!)
Den Verweis auf die STL würde ich deutlicher herausarbeiten, z.B. so
Die für C++ neuentwickelte Bibliothek hat ihren Ursprung schon in den frühen 1980er Jahren (iostream.h ist als Ersatz für stdio.h konzipiert worden), wurde aber im Laufe der Standardisierung nicht zuletzt durch den Einfluss der sog. STL (Container- und Iteratorklassen, Funktoren) stark überarbeitet und erweitert (string). Alle Namen sind mittlerweile im namespace std definiert, wenn man die Header ohne das Suffix .h verwendet. Die ältere Form der Header mit Suffix sollte in neugeschriebenen Programmen vermieden werden. Bei den meisten Compilers liegt die C++-Bibliothek komplett als C++ Code (core language) vor und kann somit vom Compiler selbst übersetzt werden.
Dann sind auch Container... namespaces und die Suffixe ausreichend erwähnt.
Den ersten und letzten Absatz des deutschen Artikels habe ich leicht geändert (und wie ich glaube auch verbessert.) Die Stellung der C-Bibliothek in der Sprache C++ sollte so bleiben und ist besser als im französischen Artikel.
Das von mir benutzte Prinzip pars pro toto würde ich in einem Lexikonartikel beibehalten. (nur den sin erwähnen, obwohl die Aussage für alle Funktionen gilt)
Mit der schlechten Qualität der Artikel und der Literatur hast Du ebenfalls recht. Und das gilt leider auch für den C++-Artikel und speziell seine Literaturverweise. Aber eines nach dem anderen, wenn es nicht jemand anderer in die Hand nimmt. Ich hätte aber schon Vorschläge.
Ein Beispiel ist fuer mich das teils gute/teils fehlerhafte Internetskript von Müller/Schwarzer, das man mit google gerade mit seinem Fehler gut findet:
google-Suche: +"~=" +compl_eq
Eine ~= Operator gibt es in C++ nicht!
brf
Statt einer langweiligen Aufzählung der Header würde ich kurze Beispiele einbauen. Für die Stringverarbeitung und die char_traits z.B. passend zur deutschen Sprache eine Dudensortierung:
#include <iostream> using namespace std; #include "destring.hpp" int main() { destring s [100]; int i, j, n; for (i = 0; i < 100 && (cin >> s [i]); i++) { cout << endl << s [i]; } n = i; for (i = 0; i < n-1; i++) { for (j = i+1; j < n; j++) { if (s [i] > s [j]) { destring h; h = s [i]; s [i] = s [j]; s [j] = h; } } } for (i = 0; i < n; i++) { cout << endl << s [i]; } return 0; }
mit destring.hpp
#ifndef _DESTRING_HPP #define _DESTRING_HPP #include <string> #include <iostream> #include <cctype> /* In den Standard char_traits<char> * werden Funktionen gezielt nach den deutschen Dudenregeln * ersetzt */ struct de_traits: public std::char_traits<char> { static char tode (char c) { if (c == 'Ä') return 'a'; if (c == 'Ö') return 'o'; if (c == 'Ü') return 'u'; if (c == 'ä') return 'a'; if (c == 'ö') return 'o'; if (c == 'ü') return 'u'; return std :: tolower (c); } /* Die Anordnung der Stichwoerter ist alphabetisch. Die Umlaute „, ”, , „u werden wie die nichtumgelauteten Selbstlaute a, o, u, au behandelt. Die Schreibungen ae, oe, ue werden nach ad usw. eingeordnet. Der Buchstabe á wird wie ss eingeordnet. Bei gleichlautenden W”rtern steht das á vor dem ss. */ static bool eq(const char& c1, const char& c2) { char ch1, ch2; ch1 = tode (c1); ch2 = tode (c2); return ch1 == ch2; } // return whether c1 is less than c2 static bool lt(const char& c1, const char& c2) { char ch1, ch2; ch1 = tode (c1); ch2 = tode (c2); return ch1 < ch2; } // compare up to n characters of s1 and s2 static int compare(const char* s1, const char* s2, std::size_t n) { for (std::size_t i=0; i<n; ++i) { if (!eq(s1[i],s2[i])) { return lt(s1[i],s2[i])?-1:1; } } return 0; } }; // Definition eines Spezialtyps fuer deutsche Strings typedef std::basic_string<char,de_traits> destring; /* Definition des output operators (output inserters) * da globale Funktionen nicht mit der Klasse generiert werden. */ inline std::ostream& operator << (std::ostream& strm, const destring& s) { // Konversion des destrings mit member-Funktionen in einen string return strm << std::string(s.data(),s.length()); } /* Definition des input operators (input extractors) */ inline std::istream& operator >> (std::istream& strm, destring& des) { std::string s; strm >> s; des = destring (s.data(),s.length()); return strm; }
#endif // _DESTRING_HPP
brf
- Thema STL – Den von dir geschriebenen Absatz dazu finde ich nicht schlecht. Ein paar Anmerkungen habe ich aber dazu:
- "Die STL" gibt es nicht (siehe Einzelheiten dazu im Artikel STL). Entsprechend sollte man es auch nicht so darstellen. Hier muss genauer gesagt werden, was damit gemeint ist. Im englischen Artikel kommt STL übrigens nicht vor.
- Alle Namen sind mittlerweile im namespace std definiert, wenn man die Header ohne das Suffix .h verwendet – das klingt so, als hätte man die Alternative zwischen Header mit und ohne Suffix .h. #include <iostream.h> ist aber kein gültiges C++. (Entsprechend würde ich nicht schreiben "iostream.h", sondern "der Header iostream")
- Woher hast du eigentlich die Programmierbeispiele? Denk daran, dass wir nicht einfach so Sachen in die Artikel hineinkopieren dürfen. (Urheberrechtsverletzung!)
- 21:51, 22. Jun 2005 (CEST)
Von hinten nach vorne:
selber geschrieben und noch nicht komplett (das ß fehlt noch). Du darfst das Beispiel gerne mal kritisch beäugen, wenn Du einverstanden bist, es auch in den Artikel zu packen.
Die STL gibt es nicht, aber sie wurde von mehreren Leuten als objektorientierte und generische Bibliothek mit den wesentlichen Elementen Container, Iteratoren, Algorithmen und Funktoren entwickelt. Und die Varianten stimmen hier doch auch untereinander und mit C++ überein, oder???
Die für C++ neuentwickelte Bibliothek hat ihren Ursprung schon in den frühen 1980er Jahren (der Header iostream.h ist als Ersatz für den C-Header stdio.h konzipiert worden), wurde aber im Laufe der Standardisierung nicht zuletzt durch den Einfluss der sog. STL (Container- und Iteratorklassen, Funktoren) stark überarbeitet und erweitert (Header iostream und string). Alle Bibliotheksnamen sind mittlerweile im namespace std definiert. Dazu muss man standardkonform die Header ohne das Suffix .h verwenden. Die veraltete Form der Header mit Suffix .h sollte in neugeschriebenen Programmen vermieden werden und in existierenden Programmen ersetzt werden. Bei den meisten Compilern liegt die C++-Bibliothek komplett als C++ Code (core language) vor und kann somit vom Compiler selbst übersetzt werden.
brf
- ... wenn Du einverstanden bist, es auch in den Artikel zu packen. – im Allgemeinen ist es nicht erwünscht, so umfangreiche Programmierbeispiele zu präsentieren, weil ein Enzklopädie-Artikel keine Programmieranleitung sein soll. Ich finde auch, dass der durchschnittliche Leser damit überfordert ist. Unter www.wikibooks.de gibt es aber Platz für sowas; dort könnte sich das Programmierbeispiel ganz gut machen.
Ein paar Einzelheiten:
''bool eq(const char& c1, const char& c2) { char ch1, ch2; ch1 = tode (c1); ch2 = tode (c2); return ch1 == ch2; }''
- besser:
bool eq(const char& c1, const char& c2) { char ch1 = tode (c1); char ch2 = tode (c2); return ch1 == ch2; }
- noch besser:
bool eq(const char& c1, const char& c2) { return tode (c1) == tode (c2); }
- noch besser:
bool eq(const char c1, const char c2) { return tode (c1) == tode (c2); }
- Und die Varianten stimmen hier doch auch untereinander und mit C++ überein, oder??? – nein (Näheres dazu s. Artikel STL)
- Die veraltete Form der Header mit Suffix .h sollte in neugeschriebenen Programmen vermieden werden und in existierenden Programmen ersetzt werden. – im Prinzip richtig, aber zu sehr Programmierkurs; deshalb hier nicht angebracht.
- Bei den meisten Compilern liegt die C++-Bibliothek komplett als C++ Code (core language) vor und kann somit vom Compiler selbst übersetzt werden. – ist eine Nebensächlichkeit; für den Artikel unbedeutend.
- Alle Bibliotheksnamen sind mittlerweile im namespace std definiert. – ebenso eine Nebensächlichkeit.
- Eine Gliederung der Bibliothek fände ich sinnvoll, sowie eine Aufzählung von Stärken und Schwächen.
- Noch eine Anmerkung zum C++-Artikel: Welche Literatur würdest du dort nennen, und warum? Bedenke, dass in Literaturangaben nur das Beste vom Besten aufgeführt sein soll.
- 21:13, 23. Jun 2005 (CEST)
- schlechter:
bool eq(const char c1, const char c2) { return tode (c1) == tode (c2); }
Ich habe gerade 1 Stunde des Standard überflogen. Es ist ohne & erlaubt (was am namelookup von C++ liegt), verlangsamt aber die Laufzeit von diesen String wegen der 2 call by value Aufrufe. Die Referenzen wuerde ich auf jeden Fall lassen.
C++ (wie schon gesagt) erst später.
Mach mal einen Vorschlag zur Gliederung!
Das Beispiel erschlägt einige Fliegen auf einmal: Es zeigt wie einfach man mit "tiefen" Eingriffen neue Leistungen auf des C++L herauskitzeln kann (eine Stärke); es zeigt was das an Nachteile mit sich bringt (globale nonmember müssen getrennt und neu definiert werden; das betrifft *immer* die operator <</>> Funktionen (eine Schwäche nicht der C++L sondern von C++).
Und zu den Nebensächlichkeiten: Ich stelle mir einfach vor wer den Artikel liest; sicher kein Germanist der Sprachforschung betreibt (obwohl bei uns in der Uni-bib Bücher über Pascal schon neben Portugiesisch eingeordnet worden sind!) Ein C-Programmierer, der das nachliest kann nicht schnell genug auf diese Nebensächlichkeiten hingewiesen werden, eben in diesem Artikel, damit er die größere Menge der Internetseiten über dieses Thema mit #include <iostream.h> gleich ignoriert, weil sie veraltet sind. Und das betrachte ich als klare Hilfe und Sinn dieses Artikels. An zentraler Stell Info über den aktuellen Stand!
brf
- verlangsamt aber die Laufzeit von diesen String wegen der 2 call by value Aufrufe. Die Referenzen wuerde ich auf jeden Fall lassen. – Nein, es ist ohne Referenzen wahrscheinlich schneller.
- Was sollten wir bringen?
- Grundsätzliches; Zweck der Bibliothek
- Aufbau
- Entstehung
- Stärken, Schwächen
- ...
- Wie immer wir den Artikel gestalten, er sollte nicht eine Seite mit Programmiertipps werden und muss auch für Laien verständlich sein.
Aufbau
Ich fang mal einen neuen Beitrag an, damit eine Diskussionseinheit nicht zu lang wird.
C-Plusplus-Standardbibliothek
Bemerkung zu cplusplus und c++ Überblick Die C++-Bibliothek (wie bisher) Der Einfluss der STL (neu und immer noch mein Steckenpferd) Die C-Bibliothek (wie bisher) Zweck der Bibliothek (Ersatz der Leistungen der C-bibliothek + moderate Erweiterung dieser Leistung) Aufbau (Aufzählung aller Header??? Wenn ja, dann mit einer Beschreibung und nich wie im englischen mit einer mickrigen Funktionsauswahl!) Entstehung (würde ich eigentlich weglassen, da das meisten schon gesagt wurde) Stärken (Musterbeispiel einer oo und generischen Bibliothekt) Schwächen (geringer Umfang im Vergleich zu Java) Ein Beispiel (natürlich z.B. meinen Vorschlag)
brf
- Abschnitt Entstehung würde ich weiter nach oben setzen und darin u.a. den Einfluss einer von A. Stepanov in den 80er Jahren entwickelten Bibliothek abhandeln.
- Die Erklärung der Relation zur C-Bibliothek ist in jedem Fall sinnvoll. Den bisherigen Abschnitt würde ich aber stark überarbeiten.
- Aufzählung der Header nicht. Statt dessen eine inhaltliche Gliederung der C++-Standardbibliothek. (Die Aufteilung auf die verschiedenen Header ist zum Teil historisch bedingt, und schon von daher keine gute Gliederung.)
Vorläufiger Vorschlag (die Datei liegt bei mir)
Der korrekte Titel dieses Artikels lautet „C++ Standardbibliothek“. Leider ist dieser Titel in der Wikipedia aufgrund technischer Einschränkungen nicht möglich.
Überblick
Die C++ Standardbibliothek besteht aus der speziell für C++ neu entwickelten Version der klassischen C-Bibliotheken, sowie dem kompletten Bestand der C-Bibliothek. Beispiele für den ersten Bereich sind die Header iostream und string; Beispiele für den zweiten Bereich ist der Header cmath (früher math.h).
Entstehung der C++-Bibliothek
Die für C++ neuentwickelte Bibliothek hatte ihren Ursprung schon in den 1980er Jahren (iostream), wurde aber im Laufe der Standardisierung durch den Einfluss der von D. Musser, A. Stepanov und Meng Lee entwickelten STL stark überarbeitet. Etwas zur selben Zeit wurden auch weitere Teile wie die string-Bibliothek für neu entworfen. Als Ganzes bildet die aktuelle Version eine konsistent konzipierte Bibliothek, die objektorientierte und generische Eigenschaften der Sprache gut nutzt. Der Funktionsumfang liegt jedoch nicht nur im Vergleich zum Java-API eher am unteren Ende dessen, was man bei einer modernen Programmiersprache erwartet. Mit der Einführung von namespaces in die Sprache wurde die gesamte Bibliothek in den namespace std gelegt.
Der C-Bibliotheksteil in der C++-Bibliothek
Die C-Bibliothek wurde zunächst in C++ integriert, damit man in den ersten Sprachversionen überhaupt eine Bibliothek zur Verfügung hat.
Zunächst wurde sie sogar wie in C benutzt. Im C++-Standard wurden die Namen der C-Bibliotheken geändert, um Namenskollisionen mit den neuen C++-Bibliotheken zu vermeiden. Dabei wird dem Namen ein "c" vorangestellt und das Suffix ".h" weggelassen. So heißt math.h in C++ jetzt cmath.
Natürlich hat es keinen Grund gegeben, etwa cmath für C++ neu zu schreiben, da z.B. der sin() in C und C++ keinerlei Unterschiede aufweist. Der C-Mangel fehlender Konstanten wie pi überträgt sich leider dadurch auf C++. Im Gegensatz dazu gibt es keinen Grund, etwa cstdio in C++ weiter zu verwenden, da sie komplett durch iostream ersetzt worden ist. Differenziert ist der Fall cstdlib zu sehen: diese Bibliothek enthält weiter in C++ benötigte Funktionen wie abs(), aber gleichzeitig auch Funktionen wie malloc(), die durch wesentlich bessere C++ Sprachelemente ersetzt sind (new) und deren Verwendung in C++ Programmen gravierende Nachteile mit sich bringen würde. Denn mit malloc() erzeugter dynamischer Speicher durchläuft keine Konstruktoraufrufe.
Der Zweck der Bibliothek
Der Aufbau der Bibliothek
Container
Iteratoren
Algorithmen
Ein- und Ausgabe
Strings
Datum und Uhrzeit (ctime)
Elementare Funktionen (cmath)
Komplexe Zahlen
Typidentifizierung
Exception
Informationsheader (climits...)
Ein kurzes Anwendungsbeispiel
Das folgende Programm verwendet eine aus der Bibliothek neu generierte Stringklasse destring mit deutscher Sortierung:
#include <iostream> using namespace std; #include "destring.hpp" int main() { destring s [100]; int i, j, n; for (i = 0; i < 100 && (cin >> s [i]); i++) { cout << endl << s [i]; } n = i; for (i = 0; i < n-1; i++) { for (j = i+1; j < n; j++) { if (s [i] > s [j]) { destring h; h = s [i]; s [i] = s [j]; s [j] = h; } } } for (i = 0; i < n; i++) { cout << endl << s [i]; } return 0; }
Diese Stringklasse wird in destring.hpp generiert:
#ifndef _DESTRING_HPP #define _DESTRING_HPP #include <string> #include <iostream> #include <cctype> /* In den Standard char_traits<char> * werden Funktionen gezielt nach den deutschen Dudenregeln * ersetzt */ struct de_traits: public std::char_traits<char> { static char tode (char c) { if (c == 'Ä') return 'a'; if (c == 'Ö') return 'o'; if (c == 'Ü') return 'u'; if (c == 'ä') return 'a'; if (c == 'ö') return 'o'; if (c == 'ü') return 'u'; return std :: tolower (c); } /* Die Anordnung der Stichwoerter ist alphabetisch. Die Umlaute „ä”, „ö”, „ü”, „äu” werden wie die nichtumgelauteten Selbstlaute a, o, u, au behandelt. Die Schreibungen ae, oe, ue werden nach ad usw. eingeordnet. Der Buchstabe „ß” wird wie ss eingeordnet. Bei gleichlautenden Wörtern steht das „ß” vor dem ss. */ static bool eq(const char & c1, const char & c2) { return tode (c1) == tode (c2); } // return whether c1 is less than c2 static bool lt(const char& c1, const char& c2) { return tode (c1) < tode (c2); } // compare up to n characters of s1 and s2 static int compare(const char* s1, const char* s2, std::size_t n) { for (std::size_t i=0; i<n; ++i) { if (!eq(s1[i],s2[i])) { return lt(s1[i],s2[i])?-1:1; } } return 0; } }; // Definition eines Spezialtyps fuer deutsche Strings typedef std::basic_string<char,de_traits> destring; /* Definition des output operators (output inserters) * da globale Funktionen nicht mit der Klasse generiert werden. */ inline std::ostream& operator << (std::ostream& strm, const destring& s) { // Konversion des destrings mit member-Funktionen in einen string return strm << std::string(s.data(),s.length()); } /* Definition des input operators (input extractors) */ inline std::istream& operator >> (std::istream& strm, destring& des) { std::string s; strm >> s; des = destring (s.data(),s.length()); return strm; }
#endif // _DESTRING_HPP
Stärken der Bibliothek
Schwächen der Bibliothek
Eine Schwäche nicht der Bibliothek sondern eigentlich der Sprache C++ ist die Notwendigkeit, alle globalen Funktionen, die zu einer Templateklasse gehören, bei jeder Templateinstanz neu zu schreiben, da sie nicht mitgeneriert werden. Da die Ein- und Ausgabeoperatoren immer global sein müssen, ist praktisch jede Klasse davon betroffen. Diese Schwäche geht aus dem Beispiel oben hervor.
Andere Fundstellen
siehe auch C++
siehe auch STL
siehe auch Die Standard C Bibliothek
[[Kategorie:Programmiersprache]] [[en:C Plus Plus standard library]] [[fr:C Plus Plus standard library]]
Kommentar zum Vorschlag
Zum Überblick: Diese Beschreibung, insbesondere die Einteilung ist zu oberflächlich. Hierhin gehört vielmehr eine Erwähnung der Container, usw.
Die C-Bibliothek wurde zunächst in C++ integriert, damit man in den ersten Sprachversionen überhaupt eine Bibliothek zur Verfügung hat. - Den Satz haben wir schon diskutiert, und die Sache mit dem Anfangsbuchstaben c wegen Namenskollisionen auch. Warum willst du es jetzt alles wieder reinbringen? Bitte ersatzlos streichen.
Das Programmierbeispiel ist zu lang.
Der Aufbau der Bibliothek: Bitte Listen vermeiden.
So wie du es vorschlägst, würde der Text eher nach www.wikibooks.de passen. Kennst du Wikibooks?
Bitte lies
Edieren!!!
Die Vorschläge stehen zum Verbessern da. Bitte trag Deine (oder tragt Euere) Vorschläge ein! Dann können wir drüber diskutieren. Mein Vorschlag liegt auf dem Tisch und ich halte ihn für brauchbar; wenn es Kritik gibt mindestens für eine Diskussionsgrundlage!
Da ich nicht weiß ob ich mit einer/mehreren Personen diskutiere, Wenn die letzte Kritik von jemand anderem war als die oberen Beitraege, dann ließ bitte die ganze Diskussion!
Zu den einzelnen Punkten:
Überblick; Mein erster Vorschlag hat genau das enthalten und der Verweis auf Container/StL ist wegen Kritik rausgeflogen.
C-Bibltiothek: Vielleicht markierst Du was genau Du streichen würdest. Ich finde diese Information wichtig (und auch nützlich für von mir imaginierte Leser)
Zu langes Programmierbeispiel: C++ und seine Bibliothek ist kompliziert. Wenn man nicht gerade Hallo-Programme schreibt, wenn man etwas zeigen will, landet man immer bei längeren Beispielen. Das geht mir in Kursen so und das zeigen alle Lehrbücher. Passend zur deutsche Seite über die Bib. fand ich ein Beispiel zur deutschen Sortierung geeignet. Gerade weil es eine Stärke der Bib. (Mit Ersetzen der traits kann man eir einer komplexen Klasse neue Leistungen herauskitzeln) und eine Schwäche (für ß, span. ch ll gehts nicht mehr; die globalen Funktionen müssen neu geschrieben werden) deutlich demonstriert. Was will man in einem solchen Artikel anderes. Alles drunter bleibt doch bei Blablabla
Aufbau: Es soll keine Liste werden, sondern die von mir angepeilte Untergliederung zeigen. Wie ich oben schon sagte, ist das alles noch nicht fertig. Ich fülle die Teile, wenn die Gliederung steht. Und ich hab sie mir in diesem Beitrag neu ausgedacht, weil Du oder jemand anderer im vorangehendem Artikel geschrieben hatte:
Aufzählung der Header nicht. Statt dessen eine inhaltliche Gliederung der C++-Standardbibliothek. (Die Aufteilung auf die verschiedenen Header ist zum Teil historisch bedingt, und schon von daher keine gute Gliederung.)
Deshalb sollte das ein Vorschlag für eine inhaltliche Gliederung sein
Für Wikibooks würde ich noch deutlich mehr schreiben.
brf
- Ok, wenn es ein Vorschlag für eine inhaltliche Gliederung sein soll, dann ist es gut.
- Dein Programmierbeispiel ist für sich genommen nicht schlecht, überschreitet aber bei weitem das, was in einen Enzyklopädieartikel gehört. Du schreibst ja selbst: "Das zeigen alle Lehrbücher" (= deine Worte, s.o.). Aber genau das soll Wikipedia eben nicht sein. Wikipedia soll kein Kurs oder Lehrbuch sein und auch keine Programmierreferenz. Vielmehr soll ein laienverständlicher Überblick gegeben werden. Für alles, was mehr in die Tiefe geht, bietet sich eventuell Wikibooks an.
- Ich habe jetzt einen Anfang vorgelegt, und würde von deinen Vorschlägen eventuell noch einarbeiten:
- komplexe Zahlen
- Unterstützung von C++-Ausnahmen durch die Standardbibliothek
- Stärken und Schwächen
- Zusammenspiel zwischen Sprachkern und Standardbibliothek
- --80.136.109.74 1. Jul 2005 20:04 (CEST)
Weitere Vorschläge
- Benutzbarkeit als Rahmenwerk zur Erweiterung der angebotenen Hilfsmittel (Konventionen und Hilfstechniken, die es ermöglichen, Ein-/Ausgaben für eigene Datentypen im Stil der eingebauten Datentypen anzubieten)
- Unterstützung für Sprachmittel wie Speicherverwaltung und Laufzeittypinformation
- Unterstützung von Informationen über implementierungsspezifische Aspekte der Programmiersprache, wie z.B. den größten Integer-Wert
- Bereitstellung von Funktionen, die nicht unter jedem System in der Programmiersprache selbst optimal implementiert werden können (z.B. sqrt() oder memmove())
- Bereitstellung nichttrivialer Hilfsmittel, zur Unterstützung der Portabilität (z.B. Listen, assoziative Felder, Sortierfunktionen, Ein-/Ausgabedatenströme)
- allgemeine Basis für andere Bibliotheken
Unterstützung für Sprachmittel:
- Unterstützung von new und delete
- Laufzeittypinformation (Klasse type_info)
- Ausnahmebehandlung
- Starten und Beenden von Programmen</nowiki>
bitset
<bitset> hat keine variable Grösse und es exisitiert kein Zugriff via Key auf den Value. Deshalb ist <bitset> m.E. und ebenfalls nach Aussage meines entsetzten Dozenten (als ich ihm geschrieben habe, dass <bitset> ein assoziativer Container ist) kein assoziativer Container.
--Zubi 11:39, 15. Jun 2006 (CEST)
Hier noch verschiedene Quellen:
http://www.math.uni-wuppertal.de/~axel/skripte/oop/oop20_5.html http://relay.gmgnet.li/cgi-bin/ethz-wiki/wiki.pl?CPPTemplates
--Zubi 11:53, 15. Jun 2006 (CEST)
Iteratoren?
Meiner Ansicht nach ist der Absatz ueber Iteratoren teilweise schlecht formuliert. Zitat:
- Dabei ist nicht jeder Iteratortyp für jeden Containertyp geeignet. Z.B. kann der sehr spezielle Iterator für wahlfreien Zugriff nicht auf einen list-Container angewendet : werden, aber auf einen vector-Container. Der Eingabe-Iterator ist dagegen sehr allgemein und lässt sich somit auf jeden Containertyp anwenden.
Das ist - mit Verlaub - ziemlicher Quark. Man wendet einen Iterator nicht auf einen Container an (wie hier am Beispiel der Liste), sondern der Container stellt Iteratoren bereit (durch begin(), end(), rbegin() etc.). Die Vektor-Klasse stellt beispielsweise Iteratoren mit wahlfreiem Zugriff bereit, waehrend die Listen-Klasse nur bidirektionale Iteratoren bereit stellt. Beide sind natuerlich aufgrund der Typhierarchie auch Eingabe-Iteratoren. Der Unterschied zeigt sich erst, wenn diese Iteratoren nun in den Algorithmen verwendet werden, da diese je nach Iteratortyp unterschiedlich Laufzeitgarantien haben koennen. Beispielsweise arbeitet lower_bound() ueber eine binaere Suche und hat bei einem RandomAccessIterator eine Komplexitaet von O(log n) waehrend sie auf einem bidirektionalen (ja, geht auch) eine Laufzeit O(n) hat (die Anzahl der durchgefuehrten Vergleiche ist hier tatsaechlich nur O(log n), aber da der Iterator immer nur einen Schritt vor oder zurueck gehen kann, ist die Anzahl der operator++/-- Aufrufe O(n)). (ezander) 134.169.77.186 17:35, 4. Nov. 2008 (CET)
Tuples etc.
Wenn bereits tr1-Komponenten genannt werden, sollten unbedingt auch Tuples aufgezählt werden. Allerdings würde ich es auch für sinnvoll halten, das erst einzupflegen wenn C++0x verabschiedet wurde. Gruß --Gorp 12:32, 2. Jan. 2010 (CET)
- Nein ("auch Tuples aufgezählt werden"), ja ("erst einzupflegen wenn..."). Das Dokument ist ein Entwurf. Bereits in WP integrierte "Textstellen" hierzu sind vorgegriffen, und werden moeglicherweise korrigiert; m.E. streichen und einen Hinweis auf moeglicherweise kommendes. --Traute Meyer 19:08, 2. Jan. 2010 (CET)