std::pair sinnvoll?
-
Hi,
ich möchte gerne Datenpaare aus zwei Strings anlegen. In etwa so was:
name inhalt.
a) Ich weiß allerdings zu Beginn nicht, wie viele dieser Paare ich möchte.
b) an den String Inhalt soll gegebenenfalls noch was angehängt werden.Ist es sinnvoll, soetwas mit einem Vector aus std::pair zu basteln?
Oder ist es besser, einen zweidimensionalen Vector (so es diesen gibt) zu verwenden? Gibt es irgendwo eine gute Doku zu std::pair?
-
Map
-
std::map<std::string*, std::string*> mymap;
pair würde ich nur in Notsituationen einsetzen. Alternativ würde ich eher (wenn es vector sein soll, ein struct anlegen).
struct str_pair { std::string str1; str::string str2; }; std::vector<str_pair*> mystringpairs;
-
map<string, string> ist nur bedingt dasselbe wie vector<pair<string, string> >.
1. Die Reihenfolge bleibt nicht erhalten (falls das von Bedeutung ist)
2. map belegt mehr speicher
3. Änderungen an den String sind beim Key ungewohnt (Key löschen und neu einfügen)map<string*, string*> verstehe ich den Sinn nicht so ganz. Normalerweise setzt man eine map ein um schnell zu suchen. Nachdem string* wird aber wohl eher nicht suchen. Die Reihenfolge ist dann auch eher willkürlich.
vector<pair<string, string> > kann sinnvoll sein. Zumindest kann man leicht den Vektor erweitern und die Strings ändern.
vector<pair<string, string> > v; v.push_back( pair<string, string>( "Hallo", "Welt")); v.push_back( pair<string, string>( "Hallo", "Deutschland")); v[0].second = "Frankreich";
Um das permanente pair<string, string> zu vermeiden und zu Dokuzwecken bietet sich ein typedef an:
typedef pair<string, string> SinnvollerName;
Nachteil des pair's ist, das die Komponenten nicht benannt sind (first, second). Hat das Ding größere Bedeutung würde ich einen struct vorziehen:
struct Person { string vorname; string nachname; };
Ist das Einfügen wichtig und häufig, dann ist eine std::list ggf. besser als ein std::vector.
Kennt man die ungefähre Anzahl der Elemente, dann kann man mit einem vector<>::reserve (oder resize) die Einfügerei beschleunigen.
Und ja, zweidimensionaler Vector geht (hier aber wohl eher nicht notwendig):
vector<vector<string> > v; v.push_back( vector<string>()); v[0].push_back( "Hallo"); v[0].push_back( "Welt"); v[1].push_back( "Hallo"); v[1].push_back( "Deutschland"); v[0][1] = "Frankreich";
pair ist jetzt nichts, wo ich bisher eine ausführliche Doku benögtigt habe, benutze meistens:
"The C++ Standard Library", Nicolai M. Josuttis
oder
http://www.sgi.com/tech/stl/
-
Ich bin gerade etwas verwirrt. Warum verwendest du Pointer?
Edit nach dem Post von ---: Du hast Recht wenn man viel Performance erwartet sollte man sich vorher genau überlegen was man denn mit den Pairs anfangen will. Btw das Buch hab ich auch
-
Vielen Dank für die ausführluche Ausführung der Vor- und Nachteile. Da finde ich bestimmt das Richtige.
Noch mal eine Frage zu struct. Muß ich dann davon einzelne Objekte erzeugen? Ist da dann der Zugriff nicht kompliziert, wenn ich Änderungen vornehmen will? Sind sicher dumme Fragen, aber ich bin noch Anfänger und habe noch nicht mit struct gearbeitet.
-
Wenn du ein struct definierst legst du am besten ein Vekor (oder eine list oder was auch immer) davon an. Dann musst du dich nicht um die Speicherallokation kümmern und der Zugriff ist auch einfach.
Narf naja dann eben das hier ->
#include <vector> #include <string> #include <iostream> using namespace std; struct mypair { string name; string inhalt; }; mypair make_mypair(string const& name, string const& inhalt) { mypair a; a.name = name; a.inhalt = inhalt; return a; } int main() { vector<mypair> coll; coll.push_back(make_mypair("CPP", "Programmiersprache")); coll.push_back(make_mypair("Maus", "Eingabegeraet")); cout << coll[0].name << ":" << coll[0].inhalt << endl; cout << coll[1].name << ":" << coll[1].inhalt << endl; }
-
struct Person { Person( string einVorname, string einNachname) : vorname( einVorname), nachname( einNachname) {}; string vorname; string nachname; } ; vector<struct Person> v; v.push_back( Person( "Gerhard", "Schröder")); v.push_back( Person( "Hans", "Wurst")); v[1].nachname = "Eichel";
ggf. empfiehlt sich noch ein typedef auf das struct. Sollte das struct mehr Methoden bekommen, lieber eine Klasse drausmachen. Wir akzeptieren hier bei uns nur Initalisierungs-Konstruktoren in structs, aber keine Methoden oder komplexere Konstruktoren.
-
Super, danke.
Ich probiere es mal.
-
niemand schrieb:
struct Person { Person( string einVorname, string einNachname) : vorname( einVorname), nachname( einNachname) {}; string vorname; string nachname; } ; vector<struct Person> v; v.push_back( Person( "Gerhard", "Schröder")); v.push_back( Person( "Hans", "Wurst")); v[1].nachname = "Eichel";
ggf. empfiehlt sich noch ein typedef auf das struct. Sollte das struct mehr Methoden bekommen, lieber eine Klasse drausmachen. Wir akzeptieren hier bei uns nur Initalisierungs-Konstruktoren in structs, aber keine Methoden oder komplexere Konstruktoren.
Der typedef ist in C, jedoch nicht in C++ notwendig. In C++ funktioniert
vector<Person> v;
ganz so wie erhofft.
-
Hmm,
wenn ich dies eingebe:
std::vector<name_struct> v;
bekomme ich folgenden Fehler...
error: template-argument
Was mache ich denn da falsch?
-
Ist ohne weitere Infos schwer zu erkennen (zumindest ohne den Compiler zu kennen).
Hast Du ein #include<vector> in Deiner Datei?Ansonsten poste mal ein minimales Beispiel bei dem dieser Fehler auftritt.
-
1. was hat deine überschrift mit deinem prob zu tun?
müsste heissen,
"bekomme vector dekleration nicht hin"
oder so
ist in dieser datei dein
name_struct
bekannt?
-
Ich habe es erst mal einfach nur übernommen wie vorgeschlagen,
wobei ich mich noch nicht wirklich mit der Struct-Definition auseinandergesetzt habe.
#>vecor> habe ich included.struct name_struct
{
name_struct( std::string einName, std::string einText)
: name(einName), text(einText) {};
std::string name;
std::string text;
} ;std::vector<name_struct> v_name_text;
-
Sorry, sehe da keinen Fehler. Bekomme das hier per Copy&Paste kompiliert.
Mal die genaue Fehlermeldung (alles, was der Compiler auswirft) posten und welcher Compiler ist das überhaupt?
-
Mein Code lautet:
#include <iostream> #include <string> #include <fstream> //fuer dataiI/O #include <iomanip> //fuer setw() #include <cstdlib> //für EXIT_FAILURE #include <vector> int main() { struct namestruct { namestruct( std::string einName, std::string einText) : name(einName), text(einText) {}; std::string name; std::string text; } ; std::vector<namestruct> v_name_text; }
Die Fehlermeldung lautet:
test_struct.cc: In function
int main()': test\_struct.cc:22: error: template-argument
main()::name_struct' uses local
typemain()::name_struct' test_struct.cc:22: error: template argument 2 is invalid test\_struct.cc:22: error: ISO C++ forbids declaration of
v_name_text' with no
type
kerstin@linux:~/c++/programmfiles/felsenstein_pruning/AKTUELL> g++ test_struct.cc -o test_struct
test_struct.cc: In functionint main()': test_struct.cc:22: error: template-argument
main()::namestruct' uses local
typemain()::namestruct' test_struct.cc:22: error: template argument 2 is invalid test\_struct.cc:22: error: ISO C++ forbids declaration of
v_name_text' with no
typeAls Compiler nutze ich
gcc version 3.3.4 (pre 3.3.5 20040809)
-
Die struct-Definition darf nicht in einer Funktion stehen.
#include <iostream> #include <string> #include <fstream> //fuer dataiI/O #include <iomanip> //fuer setw() #include <cstdlib> //für EXIT_FAILURE #include <vector> struct namestruct { namestruct( std::string einName, std::string einText) : name(einName), text(einText) {}; std::string name; std::string text; }; int main() { std::vector<namestruct> v_name_text; }
-
Ah so...
Ok, ich muß noch viel lernen...
Vielen Dank,
dann klappts bestmmt!