C++, einige array fragen
-
1. geht z.B. mit std::vector
-
fabiopigi schrieb:
1. wenn ich einen array definiere mit 10 elementen, und dann später im programm merke, ich bräuchte eigentlich 15, kann ich dem array weitere 5 elemente anhängen?
Nein. Du musst ein neues Array mit 15 Element anlegen und die alten Elemente in das neue kopieren. (oder ne Datenstruktur wie std::vector nehmen, die das für dich erledigen)
2. kann ich einen array mit unterschiedilchen typen definieren? zB die ersten fünf elemente als int, dann zwei mit einem char, und noch weitere 3 mit float?
Nein. (Du könntest zwar versuch das zu simulieren durch ein void* Array und dann auf Variablen unterschiedlicher Typen zeigen, aber das ist ziemlich eklig).
-
1.) Geht nicht. Wenn du einen erweiterbaren Array benötigst, dann verwende
std::vector.2.) Geht nicht. Wenn du einen heterogen Array benötigst, dann kannst du dir
ja mal boost::variant oder boost::any anschauen.
-
hm, verschiedene typen gehen also nicht, oke, da wäre mal mein ideenansatz weg.
irgendjemand ne idee wie ich so etwas speichern könnte?also einen mehrdimensionalen array, jedes chemische element ein weiterer array im array.
also in php etwa so:
elemente[H][name]="Wasserstoff" elemente[H][oz]=1
elemente[H][gewicht]=1.00794 elemente[H][smp]=14.01elemente[Na][name]="Natrium" elemente[Na][oz]=11
elemente[Na][gewicht]=22.989768 elemente[Na][smp]=370.95wobei halt ordnungszahl nen int ist, name nen string, und die anderen werte float oder double.
edit:
okey, ich werde mir mal boost anschauen und vector, danke
-
ich würde auf klassen spekulieren

-
fabiopigi schrieb:
edit:
okey, ich werde mir mal boost anschauen und vector, dankeboost::variant oder boost::any ist nicht wirklich für sowas gedacht, schau dir mal lieber struct und weitere Grundlagen an
-
microwAve schrieb:
ich würde auf klassen spekulieren

struct's würden auch noch gehen
Und Boost würde ich da erstmal rauslassen, würde evtl etwas zu kompliziert...möp, hinweizz ist doof :p
-
ich denke das du mit klassen, vererbung und virtuellen Funktionen am besten dran bist. weiss aber nicht genau was dabei rauskommen soll.
basta
(mehr sag ich nicht)
-
Das hat weder was mit Vererbung noch virtuellen Funktionen zu tun.
@fabiopigi: Du könntest es so bauen: Du hast eine Klasse (oder struct) Element, die all deine Daten pro Element speichert (Name, oz etc) und eine Container-Klasse Elemente, die Objekte vom Typ Element in einer Hashtabelle (string, Element) speichert. In Elemente überlädst du den Array-Indizierungsoperator:
Element Elemente::operator[](const std::string& name);
Dann schreibste dir noch eine addElement Methode und schon kannste einfach per
elemente["H"].name = "foo", deine Elemente bearbeiten.
-
ich muss ehrlich sagen, die antworten klingen gut, nur hab ich noch nicht so den durchblick (erst zwei wochen her seit dem hallo welt obligatorium). habs jetzt einfacher und für mich verständlicher gelöst.
einen array mit allen namen, einen array mit allen ordnungszahlen, usw.
ist wahrscheinlich nicht so schön, weil es nicht mehr verschachtelte arrays sind, sondern 5 einzelne arrays, aber funktionieren tutsdanke trotzdem für die vielen antworten (kaum ein forum gesehen wo einem so schnell geholfen wird
)
-
fabiopigi schrieb:
einen array mit allen namen, einen array mit allen ordnungszahlen, usw.
ist wahrscheinlich nicht so schön, weil es nicht mehr verschachtelte arrays sind, sondern 5 einzelne arrays, aber funktionieren tutsGut, Hauptsache es funktioniert erstmal
Wenn du es verbessern willst, kannst du einfach ein Array machen mit einem struct als Inhalt. Etwa so:struct Element { string name; int oz; //... };Ist auch recht simpel, du musst keine Operatoren überladen und nix. Wenn du ein Element hinzufügen willst, sähe das ungefähr so aus:
vector<Element> daten; Element e; // Elemente-Daten auslesen e.name = "bla"; e.oz = 12; daten.push_back( e ); // Und Zugriff mit cout << daten[0].name << " " << daten[0].oz << endl; // Bzw statt 0 einen entsprechenden Index verwenden, die Anzahl der Elemente erhältst du mit unsigned int anzahl = daten.size(); // oder size_t anzahl = daten.size(); // size_t ist auch ein ZahlentypBtw, was für Arrays verwendest du? Statische wie
int oz[100]odervector<int>?
-
Ist natürlich schlecht, dass dir hier keiner ein bisschen Code gibt.
Also gesagt wurde sowas:typedef struct { std::string name; int oz; float /*oder double*/ gewicht; float smp; } element; ... element pse[109]; //Speichert Elemente Anhand der OZ pse[1].name = "Wasserstoff"; pse[1].oz = 1; pse[1].gewicht = 1.00794; pse[1].smp = 14.01; ...Falls du jetzt anhand des Zeichens auf das Element zugreifen möchtest, bietet C++ den Map-Container an:
... std::map<string, element> pse; element h; h.name = "Wasserstoff"; h.oz = 1; h.gewicht = 1.00794; h.smp = 14.01; pse["H"] = h; //So kannst du auch wieder lesen std::cout << pse["H"].name << pse["H"].oz << pse["H"].gewicht << pse["H"].smp << std::endl;Grüße
Martin
-
sieht noch verständlich aus der snipplet.
falls ich nach der analysis übung noch zeit hab, versuch ich das programm noch umzuschreiben.
die arrays die ich benutze sind "fixe", also int oz[10]
in unserem vorlesungsmaterial ist noch nix von vektoren aufgetaucht, aber wie's aussieht sind die etwas flexibler als arays.was ist den der unterschied zwischen arrays und vectoren? resp was die vor und nachteile von denen?
-
fabiopigi schrieb:
was ist den der unterschied zwischen arrays und vectoren? resp was die vor und nachteile von denen?
Naja, Arrays sind Größen-unveränderbar
Vectoren sind Klassen, die den Speicher innendrin verwalten, zur Übersicht kannst du dir ja mal http://cppreference.com/cppvector/index.html angucken.
-
Schau mal hier rein.
-
schauen vielversprechend aus, die vektoren, vorallem da auch eine gewisse ähnlichkeit zu php besteht.
kann/darf man auch einen mehrdimenionalen vektor machen?
-
vector< vector< vector< vector<int> > > >

-
Hier nochmals etwas einfacher zusammengefasst. Ich denke der Code sollte selbsterklärend sein.
#include <string> #include <map> using namespace std; struct Element{ string name; int oz; float gewicht; float smp; }; int main(){ map<string, Element> elemente; elemente["H"].name = "Wasserstoff"; elemente["H"].oz = 1; elemente["H"].gewicht = 1.00794; elemente["H"].smp = 14.01; elemente["Na"].name = "Natrium"; elemente["Na"].oz = 11; elemente["Na"].gewicht = 22.989768; elemente["Na"].smp = 370.95; }
-
@JimmydaMage: Warum C-Style?
@Tanren: struct und class sind identisch, wenn man außer acht lässt, dass default-access bei Klassen auf private steht und bei Strukturen auf public.
=>struct element { std::string name; unsigned int on; // gibt übrigens nur positive Ordnungszahlen ^^ double weight; double mp; double bp; element(std::string const& name, unsigned int ordinal_number, double weigth, double melting_point, double boiling_point) : name(name), on(ordinal_number), weight(weight), mp(melting_point), bp(boiling_point) {} }; int main() { std::map<std::string, element> map_elements; map_elements.insert(std::make_pair("H", element("Wasserstoff", 1, 1.00794, 14.01, 100.0))); map_elements.insert(std::make_pair("Na", element("Natrium", 11, 22.989768, 370.95, 120.0))); }... dann kannst du dir auch noch schön den operator<< überladen um eine anständige Ausgabe hinzubekommen
