Array und Hashes in C++
-
Hallo zusammen,
ich lerne an der Uni Ruby und bringe mir zu Hause C++ mit einem 900-Seiten-Wälzer gerade bei...
Hab' mir dort jetzt das Kapitel "Arrays" durchgelesen und, wenn ich das richtig verstanden habe, kann man in die Arrays nur andere Arrays oder Daten EINES bestimmten Types stecken... ist das richtig???
Und ich muss vorher festlegen, wie groß der Array ist???
Das würde doch die Flexibilität eines Arrays total einschränken...
int Zahlen[10];
Wie kann ich denn zB folgenden Array in C++ schreiben?:
array=[2, "Haus", [2.2, "c"]]Und andere Frage:
In meinem Buch hab' ich gar kein Kapitel über Hashes gefunden...
es gibt doch wohl Hashes in C++, oder?Danke für alle Antworten...
-
Zu deinen Fragen.
1. Wenn du flexible Arrays willst nimm std::vector statt statischer Arrays (siehe Magazin).
2. Du kannst nicht so einfach verschiedene Typen in ein Array stecken. Ehlich gesagt sehe ich auch keinen Sinn darin.
Wenn du sowas wirklich einmal brauchst bieten sich Typen wie boost::any oder boost::variant an.
3. Zum Erzeugen von Hashes gibt es nichts im C++Standard, aber dafür gibt es ja diverse Bibliotheken die das anbieten.
-
Barcelona schrieb:
Hallo zusammen,
ich lerne an der Uni Ruby und bringe mir zu Hause C++ mit einem 900-Seiten-Wälzer gerade bei...
Hab' mir dort jetzt das Kapitel "Arrays" durchgelesen und, wenn ich das richtig verstanden habe, kann man in die Arrays nur andere Arrays oder Daten EINES bestimmten Types stecken... ist das richtig???
Und ich muss vorher festlegen, wie groß der Array ist???
Das würde doch die Flexibilität eines Arrays total einschränken...
Für Flexibilität in der Größe gibts Container, oder zur Not auch simple dynamische Arrays.
Wie kann ich denn zB folgenden Array in C++ schreiben?:
array=[2, "Haus", [2.2, "c"]]garnicht, C++ ist eine statisch typisierte Sprache, wo solche Konstrukte eher unerwünscht sind. Soetwas würde einige der Möglichkeiten untergraben, Programmierfehler bereits zur Compilezeit festzustellen.
Und andere Frage:
In meinem Buch hab' ich gar kein Kapitel über Hashes gefunden...
es gibt doch wohl Hashes in C++, oder?Kommt drauf an was du unter Hashes verstehst. Container mit der Zuordnung von Schlüssel-Wert-Paaren nennen sich in C++ std::map und std::multimap. Hashfunktionen werden von der Standardbibliothek nicht direkt angeboten.
Du solltest allgemein nicht danach trachten, C++ "wie Ruby" oder wie irgendeine andere Sprache zu behandeln. In verschiedenen Sprachen gibts verschiedene Programmierparadigmen, verschiedene Problemlösungsansätze und entsprechend kann man nicht die Ansätze aus einer Sprache direkt auf eine andere übertragen.
-
Das Hashmaps nicht angeboten werden, stimmt ja nun so nicht:
std::tr1::unordered_map<Key, Value>
-
Barcelona schrieb:
Hallo zusammen,
Hab' mir dort jetzt das Kapitel "Arrays" durchgelesen und, wenn ich das richtig verstanden habe, kann man in die Arrays nur andere Arrays oder Daten EINES bestimmten Types stecken... ist das richtig???Richtig.
Barcelona schrieb:
Und ich muss vorher festlegen, wie groß der Array ist???
Richtig.
Barcelona schrieb:
Das würde doch die Flexibilität eines Arrays total einschränken...

Ein Array ist auch nicht besonders flexibel. Und manchmal ist es genau das, was man braucht. Das Designprinzip in C und C++ ist: Don't pay for things you don't use. Elemente "moderner" Sprachen haben, was dies angeht, einen relativ hohen Overhead. Ich kenn micht mit Ruby nicht aus, aber da Du "Hashes" im Betreff drin hast, gehe ich mal davon aus, dass Du so etwas haben willst, wie std::map. In C++ kannst Du Dir aus den low-level Sprachelementen selbst höhere Abstraktionen zusammenbauen.
Bzgl Homogenität der C++ Container: Du vergisst, dass in anderen "modernen" Sprachen wie Ruby oder Java, Objekte nie direkt gehalten werden können, sondern nur über Referenzen (indirekt) erreichbar sind. Diese "Referenzen" sind dann eigentlich homogen, sie verweisen nur womöglich auf Objekte von unterschiedlichen dynamischen Typen (Polymorphie). Das gleiche (Indirektion) kannst Du natürlich auch in C++ haben.
Barcelona schrieb:
Wie kann ich denn zB folgenden Array in C++ schreiben?:
array=[2, "Haus", [2.2, "c"]]Gar nicht. Du kannst aber -- wenn Du unbedingt willst -- soetwas machen:
#include <vector> #include <string> #include "boost/any.hpp" #include "boost/tuple/tuple.hpp" using std::vector; using std::string; using boost::any; using boost::any_cast; using boost::tuple; using boost::make_tuple; int main() { vector<any> vec; vec.push_back(2); vec.push_back(string("Haus")); vec.push_back(make_tuple(2.2,string("c"))); }Das funktioneirt, weil Du jeden ("Wert"-) Typ zu einem "any" konvertieren kannst und das any-Objekt eine Heap-allozierte Kopie verwaltet, die intern durch einen Zeiger erreicht werden kann. Unter der Haube macht Ruby das wahrscheinlich genauso. In C++ brauchst Du für diese Abstraktionen keine extra Sprachelemente. Du (oder irgendein schlauer Bibliotheksentwickler) kann(st) diese Abstraktionen selbst in der C++ Sprache in Form einer Bibliothek verfassen. Die Abstraktions-Bandbreite von C++ ist recht hoch und reicht eben auch viel tiefer (low level) als Java/Ruby.
Ich würde Dir trotzdem davon abraten so einen any-vector zu benutzen. Du bist dann nämlich die ganze Zeit damit beschäftigt, die Typen dynamisch zu prüfen:
void foo(vector<any> & dings) { typedef tuple<double,string> bums_t; for (int k=0, e=dings.size(); k<e; ++k) { any & element = dings[k]; bums_t * ptr = any_cast<bums_t>(&element); if (ptr) { // Objekt war wirklich ein tuple<double,string> // und ptr zeigt jetzt darauf. } } }Das ist meistens totaler Käse. Versuche stattdessen das Typsystem von C++ sinvoll einzusetzten.
Und andere Frage:
In meinem Buch hab' ich gar kein Kapitel über Hashes gefunden.
es gibt doch wohl Hashes in C++, oder?Es gibt assoziative Container, zB std::map.
Gruß,
SP
-
[quote="pumuckl"]
Barcelona schrieb:
Du solltest allgemein nicht danach trachten, C++ "wie Ruby" oder wie irgendeine andere Sprache zu behandeln.
Das kann ich nur unterstreichen. Das funktioniert nämlich genauso wenig, wie die Wort-für-Wort Übersetzung vom Chinesischen ins Deutsche.
Gruß,
SP