Der Grund ist, dass über die Keys (Anzahl immer fix) die assoziierenden Values regelmäßig aktualisiert werden aber auch häufig die Keys der Value-Extremwerte (min/max und die folgenden darauf folgenden x) ermittelt werden sollen.
Das heißt ich will nicht nur per Key die assoziierenden Values aktualisieren, sondern auch anhand der Value-sortier-Position die assoziierenden Keys herausfinden (zB die maximalen x oder minimalen x Values der kompletten Liste).
Funktionieren tut das natürlich auf verschiedenen Art und Weise. Ich finde nur total unschön, dass man mindestens immer von einer Seite aus einen Kompromiss eingeht um den gewünschten Zugriff zu erhalten, zB gibt es folgende Möglichkeiten, die halte ich aber für unschön und langsam:
1. Nehme unordered_multimap: Wert A als Key. Wert B als Value.
Vorteil: Aktualisieren von Wert B über Key A geht easy.
Nachteil: Zugriff auf die x max/min Werte B der Liste geht nicht da nicht danach sortiert. Man müsste also die Map komplett durchiterieren oder etwas anderes machen um die x max/min Werte B der Liste zu finden und daraus die assoziierenden Keys A.
1b: Das selbe als unordered_multiset mit std:: pair. Vor-Nachteile müssten identisch sein.
2. Nehme multimap (ordered): Wert B als Key. Wert A als Value.
Vorteil: Map immer nach B sortiert. Zugriff auf x max/min Werte und dessen assoziierenden Wert A geht easy über begin() end().
Nachteil: Das häufige Aktualisieren des Values B (der hier der Key ist) geht nur über komplettes erase() und dann neues insert() -> sehr unschön und langsam.
2b: Das selbe als multiset (ordered) mit std:: pair. Vor-Nachteile müssten identisch sein.
3. Nehme vector mit std:: pair oder struct:
Vorteil: da die Keys fix sind kann der Key dem vector-Index entsprechen.
Vorteil: Aktualisieren von Wert B über Index A geht easy und flott.
Nachteil: Zugriff auf die x max/min Werte B der Liste geht nicht da nicht danach sortiert. Man müsste also den Vector komplett kopieren und dann per std::sort sortieren um die assoziierenden Keys der maximalen x oder minimalen x Values der kompletten Liste herauszufinden. Die Kopie muss sein da sonst nach dem sortieren die Keys nicht mehr dem Index entsprechen würden.
Daher gibt es immer einen Kompromiss:
- Kompromiss A: Das Aktualisieren der Values über den Key ist einfach wenn A als Key/Index fungiert aber dann ist das schnelle finden dieser Keys anhand der maximalen x oder minimalen x Values der kompletten Liste nur durch aufwändiges kopieren/sortieren möglich.
- Kompromiss B: Das Finden der Keys anhand der maximalen x oder minimalen x Values der kompletten Liste ist schnell möglich wenn Value B als Key fungiert und so sortiert ist aber dann ist das Aktualisieren der Values B durch Zugriff von A sehr aufwändig weil -> erst finden dann erase() dann insert().
Grundsätzlich kommt der Usecase "Aktualisiere Values B über Zugriff Key A" etwas häufiger vor als "zeige mir die assoziierenden Keys der x max/min-Werte B der ganzen Liste".
Daher ist Variante 1, 1b und 3 vermutlich tendenziell schneller als 2 und 2b. Ein Kompromiss ist es aber in beiden Fällen.
Cool wäre daher ein Container für ein pair bei dem Wert A den Key darstellt (flottes und häufiges aktualisieren des assoziierenden Values über diesen Key) UND der Container aber nach dem Value B sortiert ist (flotter Zugriff auf assoziierenden Keys über maximale x oder minimale x Values der kompletten Liste (zb über begin() end()).