Vergleichen von Vektoren/Maps
-
Hallo,
ich brauche (mal wieder) Hilfe

Zur Situation:
Ich habe zwei Maps die jeweils vom Typ <string, string> sind,
bzw. zwei Vektoren <string> (kommt drauf an wozu ihr mir ratet, kann beides nehmen).Nun sind in beiden Vektoren minimal 1 und maximal 10-15 Elemente.
Nun möchte ich möglichst performant herausfinden, welche Elemente im einen Vektor sind und im anderen nicht bzw. umgekehrt.Bsp:
Vektor 1: Name1, Name3, Name4, Name5, Name8
Vektor 2: Name3, Name1, Name6, Name7Nun soll mir der Code die Elemente von Vektor 1 liefern, die in 2 fehlen
(in diesem Fall also Name4, Name5, Name8)
und danach die Elemente die in Vektor 1 fehlen und in Vektor 2 sind.
(in diesem Fall also Name6, Name7)Problem ist nur, ich wollte eigentlich nicht hunderte Iterationen machen

Vielen Dank schonmal
Marius
-
Hallo,
Vielleicht hilft dir find_first_not_of. Das sucht nach dem ersten Element einer Sequenz welches in einer Anderen nicht vorkommt. Dann einfach die Anfangsposition verschieben und so lange weitermachen bis npos kommt.
Am Besten ist es wohl du schaust in die Hilfe dazu.Ciao
-
es gibt auch std::set_difference der setzt aber voraus, dass die beiden eingabesequenzen sortiert sind.
-
Leider hilft mir beides nicht so unheimlich weiter.
Hab das Ganze jetzt etwas umständlicher gelöst und mache halt ein paar Vergleiche mehr.Danke dennoch

-
Als erstest ordnetst du die Vectoren. Dann fährst mit 2 Iteratoren zu gleichen Zeit über beiden Vectoren. Wenn beide auf den gleichen Wert verweisen gehts du weiter in der Iteration. Wenn die Werte ungleich sind dann ist der Kleiner der beiden Werte nicht in beiden Vectoren. Wenn du am Ende eines Vectors ankommst, dann sind sämtliche Wert die noch im anderen sind nur in dem.
Beispiel:Vector1:8 5 2 1 6 7 3
Vector2:9 0 7 2 4 9 3
SortireVector1:1 2 3 5 6 7 8
Vector2:0 2 3 4 7 9 9
Ungleich: 0 fliegt rausVector1:1 2 3 5 6 7 8
Vector2:2 3 4 7 9 9
Ungleich: 1 fliegt rausVector1:2 3 5 6 7 8
Vector2:2 3 4 7 9 9
gleich: gehe weiterVector1:2 3 5 6 7 8
Vector2:2 3 4 7 9 9
gleich: gehe weiterVector1:2 3 5 6 7 8
Vector2:2 3 7 9 9
Ungleich: 4 fliegt rausVector1:2 3 6 7 8
Vector2:2 3 7 9 9
Ungleich: 5 fliegt rausVector1:2 3 7 8
Vector2:2 3 7 9 9
Ungleich: 6 fliegt rausVector1:2 3 7 8
Vector2:2 3 7 9 9
Ungleich: 8 fliegt rausVector1:2 3 7
Vector2:2 3 7 9 9
Ungleich: Am Ende, 9 und 9 fliegen rausDu hast zwar da nun strings aber man kann auch da ein Vergleichs operator implementire der sie zum Beispiel nach dem Alphabet ordnet.
-
das darauf noch niemand angesprungen ist:
Ich habe zwei Maps die jeweils vom Typ <string, string> sind
ähm ja, das sieht sehr...effektiv aus, wie willst du denn die strings speichern? beides mal der gleiche string? oder als ersten wert einen anderen?
-
Zum Ordnen:
Leider "darf" ich die Vektoren nicht ordnen.
Ich habs jetzt einfach mit find gemacht.
Mache also ne Iteration über den ersten Vektor und gucke bei jedem Element obs im zweiten ist.
Das Gleiche mache ich dann mit dem andern.
-
Wenn du die Orginalvektoren nicht ordnen darfst, dann mach doch Kopien und ordne die.
Ach so das mit find_first_not_of kann man auch vergessen. Beim genauen Hinschauen hab ich gesehen, dass es die nur für string gibt. Für Container gibt es hier nur find_first_of.
-
Ich will ja nichts sagen, aber std::map ist immer sortiert.
