map Inhalt wrid sortiert, wie unterbinden?
-
Hallo,
Trage Daten in eine Map ein
map<string, string>
mit make_pair und insert
Die Eintraege werden sortiert. Wie kann ich es fertigbringen das die Eintraege nicht mehr alphabetisch sortiert werden?
-
Noch eine Frage:
Wie kann ich einer Konsolenanwendung erstellt mi VC++2003 ein Icon zuweisen?
-
MasterOfDisasterGuest schrieb:
Hallo,
Trage Daten in eine Map ein
map<string, string>
mit make_pair und insert
Die Eintraege werden sortiert. Wie kann ich es fertigbringen das die Eintraege nicht mehr alphabetisch sortiert werden?
gar nicht. Eine std::map sortiert immer. Musst dir deine eigene map bauen, die nicht sortiert.
Wie kann ich einer Konsolenanwendung erstellt mi VC++2003 ein Icon zuweisen?
Über die Projekt-Einstellungen?
MfG
GPC
-
Hallo
1. EIne Map sortiert immer. Du kannst allenfalls im Konstruktor der Map eine andere vergleichsfunktion angeben.
2. Das hat nichts mit Standard-C++ zu tun.
bis bald
akari
-
Vielleicht genügt Dir ja auch ein vector<pair<X, Y> >
Der ist nicht sortier. Falls Dir das nicht reicht wüßte ich gerne warum.
-
Offensichtlich verwendest du die falsche Datenstruktur, such dir eine die deine Ansprüche erfüllt (ggf. ne Komposition aus anderen).
-
Lese aus einer Textdatei zeilenweise daten aus
Teilweise gibts es zeilen doppelt oder mehrfach. die doppelten oder mehrfachen müssen raus (nur einmal enthalten sein)
Man sagte mit ich soll das über eine Map machen weil der Schlüssel nur einmal vorkommen kann werden die doppelten automatisch nur einmal eingetragen. tja darum Map. Kann aber nicht gebrauchen wenns sortiert wird. Kann ich jetzt alles über den haufen schmeissen?
Wie eine eigene map die nicht sortiert wie vector aber doch die doppelten Einträge raus?
-
masterofdisastergeust schrieb:
Lese aus einer Textdatei zeilenweise daten aus
Teilweise gibts es zeilen doppelt oder mehrfach. die doppelten oder mehrfachen müssen raus (nur einmal enthalten sein)
Man sagte mit ich soll das über eine Map machen weil der Schlüssel nur einmal vorkommen kann werden die doppelten automatisch nur einmal eingetragen. tja darum Map.
Hm, das sagte ich dir. Da wusste ich aber noch nicht, dass die Daten nicht sortiert werden dürfen.
Kann aber nicht gebrauchen wenns sortiert wird. Kann ich jetzt alles über den haufen schmeissen?
Nur die Datenstruktur austauschen.
Wie eine eigene map die nicht sortiert wie vector aber doch die doppelten Einträge raus?
Ok, du kannst es ja so machen: Du schreibst eine Klasse map, die als Member zwei vectors oder listen hat. In der Methode insert prüfst du dann per find, ob der Schlüssel schon existiert. Wenn er das tut, machst du nix. Existiert er nicht, fügst du den Schlüssel und den Wert in die map ein. Klaro?
MfG
GPC
-
Jein, ich weiss was du meinst.
Habe mir eine Kopie von <map> erstellt mymap.h Klassennamen geaendert und eingebaut, um zu shcauen obs denn laueft. Das tut es auch. Programm ist fix fertig mit einer eigenen Map (Kopie von <map>)
Ok was muss ich nun aendern bzw. wo anfangen damit es nicht mehr sortiert. <map> ist einwenigkomplex zu verstehen fuer mich als beginner

Wenns nciht zuviel Aufwand ist ware ich dir sehr verbunden wenn du es mir näherbringen könntest wo und wie und warum *liebguck*
-
Es wäre möglich das Prädikat (Standard std::less<T>) für die Sortierung zu ändern, sodass die Werte unsortiert abgelegt werden. Dann funktioniert diese Datenstruktur jedoch _nicht_ mehr!
#include <iostream> #include <map> #include <utility> using namespace std; template <class T> struct true_ { bool operator()(T) { return true; } bool operator()(T, T) { return true; } }; int main() { typedef map<int, int, true_<int> > vec_type; vec_type v; v.insert(make_pair(1, 1)); v.insert(make_pair(3, 3)); v.insert(make_pair(2, 2)); for (vec_type::const_iterator i=v.begin(); i!=v.end(); ++i) cout << i->first << "\t" << i->second << endl; for (int i=1; i<=3; ++i) cout << i << "\t" << v[i] << endl; }
-
Bau diesen Ansatz hier aus:
#include <vector> template <typename T, typename U> class NoSortMap { std::vector<T> keys; std::vector<U> values; public: NoSortMap() {} ~NoSortMap() {} bool insert(const T &key, const U &val) { std::vector<T>::iterator it = find(keys.begin(), keys.end(), key); if (it !== keys.end()) return false; keys.push_back(key); values.push_back(val); return true; } };MfG
GPC
-
@ GPC:
Dann funktioniert diese Datenstruktur jedoch _nicht_ mehr!
Jetzt würde ein langweiliger Standardspruch über die Vorzüge des Lesens passsen!
Aber das spar ich mir...
-
Ok thx, tux' ansatz löscht die doppelten nicht raus
hab mit der standardmap diese Möglichkeit
for (mapLines::iterator content = m.begin(); content != m.end(); ++content) { ofs<<content->second<<'\n'; }
-
lucky_tux schrieb:
@ GPC:
Dann funktioniert diese Datenstruktur jedoch _nicht_ mehr!
Jetzt würde ein langweiliger Standardspruch über die Vorzüge des Lesens passsen!
Aber das spar ich mir...zu gütig
hab deinen Text nur überflogen und war wohl nicht ganz bei der Sache...
-
Tjo und wie auslesen, sorry habe echt keinen Plan von templates oder aehnlichem zeugs (noch nicht)
-
Zwischenfrage: brauchst du eine Map ohne Sortierung??? Map heißt Schlüssel->Wert. Du willst doch sicher nur die Zeilen als String ablegen?
Dann nimm nen einfachen vector und suche mit find oder find_if(wie GPC schon gezeigt hat), ob das Element schon vorhanden ist. Wenn nein dann an den vector ranpacken.
Also so wie es GPC auch schon gemacht hat^^ Halt nur das ein vector reicht.Auslesen im ungeprüften Fall geht dann per []-Operator.
-
Pellaeon schrieb:
Dann nimm nen einfachen vector und suche mit find oder find_if(wie GPC schon gezeigt hat), ob das Element schon vorhanden ist. Wenn nein dann an den vector ranpacken.
Und wenn's ein bissel schneller sein soll, dann nimm noch ein set<> für die Keys dazu und schau dadrin nach. Neue Daten werden im vector abgelegt und der key im set. So kann man schneller nachprüfen ob ein key schon vorkam.
-
Alles in nen vector speichern und danach mit unique_copy nen neuen vector befüllen
-
Wobei unique_copy() nur benachbarte identische Werte ausfiltert

@tux: Mit deinem Verfahren bekommst du definitiv nichts brauchbares heraus - dein "true_"-Funktor definiert keine Strict Weak Orderingund ist deshalb als Vergleichskriterium unbrauchbar.
-
Doch das Vergleichskriterium funktioniert. Man bedenke bei anderen Datenstrukturen wie vectoren klappt alles wunderbar (habe ich ausgetestet!). Das Problem liegt daran, wie die map intern die Daten verwaltet.
-
Ein Vector benötigt auch kein Vergleichskriterium
Eine Map dagegen schon (und wenn du deinen Code ausführen willst, landest du voll im Bereich "undefiniertes Verhalten" - d.h. du kannst weder sagen, in welcher Reihenfolge die Elemente eingefügt werden, noch kannst du in der map<> etwas suchen).