Positionsbestimmung in einer std::map
-
Ich habe folgenden Code der die Position einer Id bestimmt.
uint8_t GetPos(uint8_t id) const { uint8_t i; const_it ci = db.begin(); for(i=0;ci!=db.end();ci++,i++) { if(ci->first == id) { return i; } } assert(false); return 0; }Ich weiß dass eine map so etwas eigentlich nicht vorsieht.. dennoch wäre ich für Ideen dankbar.
-
Erstens: Wo genau ist dein Problem?
Zweitens: Welchen Zweck hat dieser Code? In einer map<> ist es einfacher direkt mit den Iteratoren zu arbeiten, anstatt mit Indizes. (Erstens kann sich diese Position beim nächsten insert() oder erase() schon ändern und zweitens brauchst du O(n) Zeit, um mit diesem Index wieder dein map-Element zu finden)
-
CStoll schrieb:
Erstens: Wo genau ist dein Problem?
Dieser Code ist ein Erstentwurf weil mir gerade nichts besseres einfiel.
CStoll schrieb:
Zweitens: Welchen Zweck hat dieser Code?
Es gibt eine map<int,Klasse> sie speichert Topologiedaten. An einer Stelle wird die allgemeine Position benötigt in der mir der Iterator nichts bringt.
CStoll schrieb:
In einer map<> ist es einfacher direkt mit den Iteratoren zu arbeiten, anstatt mit Indizes.
Der bringt mir leider nichts.
CStoll schrieb:
(Erstens kann sich diese Position beim nächsten insert() oder erase() schon ändern
Das ist unkritisch.
CStoll schrieb:
und zweitens brauchst du O(n) Zeit, um mit diesem Index wieder dein map-Element zu finden)
Deswegen frage ich ob jemandem etwas intelligenteres einfällt.
-
Was willst du machen, was du mit dem Iterator nicht erreichen kannst? Wenn sich das wirklich nur auf eine Stelle bezieht, kannst du ja auch an der betroffenen Stelle die Position umrechnen per
std::difference(db.begin(),pos).
-
CStoll schrieb:
Was willst du machen, was du mit dem Iterator nicht erreichen kannst? Wenn sich das wirklich nur auf eine Stelle bezieht, kannst du ja auch an der betroffenen Stelle die Position umrechnen per
std::difference(db.begin(),pos).Danke für die Idee. std::difference gibt es bei mir irgendwie nicht (VS2010) aber std::distance scheint gut zu funktionieren.
-
blub01 schrieb:
Danke für die Idee. std::difference gibt es bei mir irgendwie nicht (VS2010) aber std::distance scheint gut zu funktionieren.
das könnte an der Uhrzeit liegen
schön, daß du es trotzdem gefunden hast