Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ String-Klasse selber basteln?
Hallo
Ich arbeite gerade das Buch "Jetzt lerne ich C++" von Jesse Liberty (Markt&Technik) durch.
Im Kapitel Arrays steht folgendes:
C++ hat zwar den Null-terminierten String und die Funktionsbibliothek mit der Funktion strcpy von C geerbt, allerdings fügen sich diese Funktionen nicht in das objektorientierte Konzept ein. Eine String-Klasse stellt einen gekapselten Satz von Daten und Funktionen für die Manipulation dieser Daten sowie Zugriffsfunktionen bereit, so dass die Daten selbst gegenüber den Klienten der String-Klasse verborgen sind.
Soweit klar ...
Wenn zu Ihrem Compiler noch keine String-Klasse gehört (und selbst, wenn sie dazu gehört), sollten Sie sich eine eigene zusammenbauen.
Schreibt er das, weil es keine gescheite String-Klasse gibt (kann ich mir garnich vorstellen) oder weil es eine gute Übung ist? Oder ist diese Aussage schlicht veraltet?
PS Ich verwende den Gnu C++ Compiler unter Linux
anda_skoa
18-02-2004, 05:27
Es gibt in der C++ Standardbibliothek schon einen Stringklasse namens string.
Wenn das nicht im Buch steht, ist es schon ziemlich alt.
#include <iostream>
#include <string>
int main()
{
std::string text = "Hallo Welt";
std::cout << text << std::endl;
return 0;
}
Das std:: ist zur Auflösung des Namensraums, zu dem die Klasse string gehört.
Man kann das auch so schreiben
#include <iostream>
#include <string>
using std::string;
using std::cout;
using std::endl;
int main()
{
string text = "Hallo Welt";
cout << text << endl;
return 0;
}
Ciao,
_
Danke!
In dem Buch steht zwar, dass in den meisten C++-Compilern eine String-Klasse vorhanden ist aber es wird nicht weiter darauf eingegangen. So alt ist das Buch nicht, ist von 2000. Aber es handelt eigentlich nur von Klassen, Vererbung usw. also wirklich NUR die Grundlagen. Arrays wurden nur mal angekratzt.
Tipp: Such mal im Web nach STL (steht für Standard Template Library). Die bietet echt viel. Ein Buch dazu währ auch ne sinnvolle Investition.
Alle std::* Sachen sind näml. Teil der STL, und eine Implementation der STL sollt bei jeden besseren C++ Kompiler dabei sein (z.B. g++).
Schen, die in der STL nicht enthalten sind, findet man dann oft in der Boost Bibliothek (ist nicht vorinstalliert aber gibts für Windows und POSIX kompatiblen Systemen): http://www.boost.org
Aber du wirst zur Zeit sicher noch mit der STL auskommen. ;)
ContainerDriver
25-02-2004, 12:03
Mal ne Frage:
ist eine Stringklasse (z.B. die Standardtstringklasse aus der C++ Bibliothek) eine verkette Liste? Ich mein das so:
struct part
{
char char_value;
part* next;
}
class String
{
private:
part part1;
public:
... //irgendwelche Methoden und Operatorenüberladungen
}
Die Struktur part ist ja hier eine verkette Liste. Ist die Standardtstringklasse aus der C++ Bibliothek auch so ähnlich aufgebaut?
Original geschrieben von florian hanisch
Mal ne Frage:
ist eine Stringklasse (z.B. die Standardtstringklasse aus der C++ Bibliothek) eine verkette Liste?
Die Struktur part ist ja hier eine verkette Liste. Ist die Standardtstringklasse aus der C++ Bibliothek auch so ähnlich aufgebaut?
Es ist vom Standard erlaubt,daß std::string intern so aufgebaut ist,ja.
Der Speicher muß nicht zusammenhängend sein,aber praktisch jede Implementierung von std::string macht es so.Klar,es ist einfach und effektiv (zb. ist c_str() ein billiger Funktionsaufruf,wenn die Implementerung eine Liste wäre,dann nicht mehr).
IIRC hat der STLPort eine Klasse rope,die einen string intern als Liste implementiert (aber der STLPort ist outdated,denn benutzt man nicht mehr).
Persönlich wäre es mir lieber,wenn std::string laut Standard einen zusammenhängenden Speicher haben müßte (und nicht dem Implementierer die Freiheit läßt),genau wie std::vector,das wäre praktischer.
ContainerDriver
25-02-2004, 13:22
Und was ist der Vorteil von zusammenhängenden Speicher (Geschwinidkeit?)?
Original geschrieben von florian hanisch
Und was ist der Vorteil von zusammenhängenden Speicher (Geschwinidkeit?)?
Das kommt immer auf die Operation an.Genau wie für den einen Anwendungsfall eine Liste besser ist,und für den anderen ein vector.
Ein Worstcase Fall für eine Listenimplementierung ist sicherlich c_str().Der Standard schreibt vor,daß man den Content des String in _einem_ zusammenhängend Speicher bekommt,der mit einer 0 abgeschlossen ist.
So,jetzt muß erstmal alles von der Liste kopiert werden in einer Speicherblock,der vorher noch angelegt werden muß.
Vorteile der Listen Implementerierung sind aber z.b Löschoperationen,oder Einfügen.
[IIRC ist die rope Implementierung aber eher deque ähnlich,also Chunks von Strings,die untereinander verpointert sind]
Weiterhin ist wird der Speicher besser ausgenutzt (es wird ebend nicht ein großer Block benötigt).
Aber die meisten Vorteile der Listenimplementierung werden erst bei sehr langen Strings deutlich,und das ist nicht der Hauptanwendungsfall.
Viele std::string Implementierungen sind für kurze Strings optimiert,bspw. hat die Dinkumware-STL eine Optimierung für String kürzer als 16 Zeichen.
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.