map Inhalt wrid sortiert, wie unterbinden?
-
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).
-
Sry hab grad nicht genau nachgedacht als ich ein beispiel für einen container, mit dem es funktioniert, geben wollte.
Die Vergleichsfunktoren std::less<T> liefern true oder false. Der Funktor true_ liefert immer true; es findet also keine sortierung statt. Die Verwendung von true_ funktioniert mit jedem Container, der auch Vergleichsfunktoren wie less oder greater unterstützt. Selbst mit der Map funktioniert dies. Versuche doch einmal das von mir gegebene Beispiel zu kompilieren und schau dir die Ausgaben an. Bei der Ausgabe via Iterator auf dem Container werden, wie du sehen wirst, alle Schlüsssel mit den passenden Werten korrekt ausgegeben. Das Problem ist der Zugriff per Indexoperator!
-
Ja, das Programm lässt sich compilieren und wird sogar etwas ausgeben - das ist ja das Problem bei "undefiniertem Verhalten". Aber was dein Programm wirklich machen wird, kann niemand vorhersagen.
(es sortiert die Elemente vermutlich willkürlich ein, es schmeißt definitiv keine Duplikate aus der map heraus - und nach bestimmten Werten kannst du sowieso nicht suchen).