So entfernen Sie Duplikate aus einem C ++ - Vektor

So entfernen Sie Duplikate aus einem C ++ - Vektor
Duplikat bedeutet eines von zwei oder mehr Dingen, die gleich sind. Betrachten Sie den folgenden Vektor: Vektor vtr = 'e', 'g', 'i', 'e', ​​'a', 'e', ​​'c', 'a', 'c';

'E' tritt dreimal in verschiedenen Positionen auf. 'A' tritt zweimal in verschiedenen Positionen auf. 'C' tritt zweimal in verschiedenen Positionen auf. Also haben 'e', ​​'a' und 'C' Duplikate. Jeder der Rest der anderen Zeichen tritt einmal auf.

Um Duplikate in diesem Vektor zu entfernen, können Sie die Duplikate von 'e', ​​'a' und 'C' entfernen und das erste Ereignis jedes Zeichens in seiner Position zulassen. Das Ergebnis sollte sein:

Vektor vtr = 'e', 'g', 'i', 'a', 'c';

Es gibt zwei Hauptmethoden, um Duplikate aus einem Vektor zu entfernen. Ein Weg ist der direkte oder brutale Kraftweg. Auf diese Weise wird das erste Element gegen den Rest der Elemente überprüft, und jedes Duplikat wird entfernt. Das zweite Element wird gegen den Rest der anderen Elemente rechts überprüft, wodurch Duplikate entfernt werden. Das gleiche Verfahren erfolgt für das dritte Element und den Rest der Elemente. Auf diese Weise dauert normalerweise zu lange. Die andere Möglichkeit besteht darin, den ursprünglichen Vektor zu pflegen und eine sortierte Kopie davon zu haben. Entfernen Sie Duplikate aus dem sortierten Vektor, während Sie die Kopie eines beliebigen doppelten Elements als Schlüssel in einer Karte erstellen. Scannen Sie schließlich den ursprünglichen Vektor von Anfang bis Ende mit der Karte, um Duplikate zu löschen.

Diese beiden Möglichkeiten können als Brute-Force-Methode bzw. die Sort-and-Compare-Methode bezeichnet werden. Dieser Artikel veranschaulicht beide Wege. Vergessen Sie nicht, die Vektorbibliothek zu Beginn des Programms einzubeziehen.

Entfernen eines Vektorelements

Ein Vektorelement wird mit der Vektor -E -E -Member -Funktion entfernt. Die Syntax ist:

CONTEXPR ITERATOR ERASE (const_iterator -Position);

Das Argument ist ein Iterator, der auf das Element verweist, zu beseitigen wird.

Duplikate durch brutale Kraft entfernen

Mit diesem Ansatz wird das erste Element mit den Resten der Elemente rechts, eins von eins verglichen, und jedes Duplikat wird gelöscht. Das zweite Element, falls es nicht gelöscht wurde. Das gleiche Verfahren erfolgt für das dritte Element und den Rest der Elemente. Dieser Ansatz dauert normalerweise zu lange. Der folgende Code veranschaulicht es mit Iteratoren:

vectorvtr = 'e', 'g', 'i', 'e', ​​'a', 'e', ​​'c', 'a', 'c';
für (vector :: iterator iteei = vtr.Start(); iteichar ch = *itei;
für (Vector :: Iterator ITEJ = ITEI+1; ITEJif (ch == *itej)
vtr.löschen (itej);



für (int i = 0; iCout<
Cout<Dies sind Iterator für Schleifen mit einer verschachtelten Schleife. Die zweite getrennte For-Schleife ist nicht Teil des Prozesses. Es ist zum Ausdrucken des Ergebniss. Es gibt zwei für Schleifen im Prozess. Die innere For-Schleife würde durch den Rest des Vektors scannen und jedes Element mit dem von der äußeren For-Loop vergleicht. Beachten Sie die Anweisung,

Vektor:: iterator itej = itei+1;

in den Klammern des inneren Forloops.

Entfernen von Duplikaten durch Sortier- und Komparien

Beachten Sie aus der obigen Methode, dass es eine Menge Neubesiedlung (erneutes Lesen und Vergleichen) von einer großen Sequenz zu einer kleinen Sequenz von Elementen des einen Vektors gibt. Wenn der gesamte Vektor ein- oder zwei- oder dreimal gescannt wird, würde dies wahrscheinlich weniger Zugriffe der Elemente im Vergleich zum obigen Ansatz bedeuten. Nun, der gesamte Vektor kann sogar vier oder mehrmals gescannt werden, aber nicht oft oft. Dies darf nicht unbedingt mit demselben Vektor durchgeführt werden. Es kann mit Kopien des Vektors durchgeführt werden.

Mit dem zweiten Ansatz wird der ursprüngliche Vektor beibehalten, während eine sortierte Kopie daraus hergestellt wird. Der sortierte Vektor wird durchgelesen (gescannt) und das Duplikat aufeinanderfolgender Elemente löscht, die mehr als einmal aufgetreten sind. Ein Iterator für Schleife kann dies vom Anfang bis zum Ende des sortierten Vektors durch einmal durchlaufen. Während dieses Lesen und ein gewisses Löschen stattfinden, wird für jedes Element, das mehr als einmal auftritt. Dieser Wert von -1 wird in 1 geändert, um ein Duplikat anzuzeigen. Jeder Wert in der Karte ist ein Indikator für das Duplikat seines Schlüssels, der im ursprünglichen Vektor zwei oder mehrmals auftreten kann.

Wenn der sortierte Vektor mit entferntem Duplikaten erforderlich war, wird der sortierte Vektor zurückgegeben und die Arbeiten erledigt. Wenn die Reihenfolge des ersten Auftretens der Vektorelemente aufrechterhalten werden muss, muss die folgende Unterprozedur stattfinden (weiter):

Lesen Sie den ursprünglichen Vektor von Anfang an erneut. Wenn ein Schlüssel in der Karte nicht auftritt. Dies bedeutet, dass der Schlüssel kein Duplikat hat. Wenn in der Karte ein Schlüssel des ursprünglichen Vektors auftritt, bedeutet dies das erste Auftreten von Duplikaten für dieses Element im Vektor. Nehmen Sie den Anzeigenwert für den Schlüssel in der Karte 1, 1. Dieser Indikatorwert hat jetzt den Wert 1. Lesen Sie den Rest der Elemente im ursprünglichen Vektor fort und prüfen Sie nach einem doppelten Element mit der Karte. Wenn ein Schlüssel gefunden wird und der Kartenschlüsselwert 1 ist, ist das aktuelle Element ein Duplikat. Entfernen Sie das aktuelle Element. (Denken Sie daran, dass das erste Auftreten einer doppelten Taste den entsprechenden Indikatorwert in der Karte von -1 bis 1 gedreht hat.) Geben Sie weiterhin einen Wert von 1 für die Kartenschlüsselindikatoren an und entfernen Sie das ursprüngliche aktuelle Vektorelement, das bereits eine entsprechende 1 in der Karte aus dem ursprünglichen Vektor enthält. Bis zum Ende des ursprünglichen Vektors ist erreicht. Der resultierende ursprüngliche Vektor ist der Vektor ohne doppeltes Element und in der Reihenfolge mit ersten Vorkommen.

Um die Karte in C ++ zu codieren. Da die Funktion "sort () in der Algorithmusbibliothek verwendet wird, muss auch die Algorithmus -Bibliothek in das Programm aufgenommen werden. Die Überschrift für das Programm dieses Ansatzes sollte sein:

#enthalten
#enthalten
#enthalten
#enthalten
Verwenden von Namespace STD;

Das erste Codesegment in der Hauptfunktion C ++ kann sein:

Vektor vtro = 'e', 'g', 'i', 'e', ​​'a', 'e', ​​'c', 'a', 'c';
Vektor vtr = vtro;
sortieren (vtr.begin (), vtr.Ende());
Under Ordered_map Abgeordneter;

Die erste Aussage definiert den ursprünglichen Vektor. Die zweite Erklärung macht eine Kopie des ursprünglichen Vektors. Die dritte Aussage sortiert den kopierten Vektor. Die vierte Aussage erklärt die Karte ohne Initialisierung. Das nächste Codesegment in der Hauptfunktion C ++ kann sein:

für (vector :: iterator iter = vtr.Start(); IterVektor :: Iterator iter0 = iter; Vektor :: Iterator iter1 = iter + 1;
if ( *iter0 == *ITER1)
MP [*ITER1] = -1;
Iter--;
Vektor :: Iterator iter2 = vtr.löschen (iter1);

Dieses Codesegment löscht die Duplikate aus dem sortierten kopierten Vektor. Dabei erstellt es die Karteneinträge. Beachten Sie, dass die Iteration in den Klammern der For-Schleife das letzte, aber einelige Element erreicht (und nicht das letzte Element). Dies liegt daran, dass die aktuellen und die nächsten Elemente am Code beteiligt sind. Beachten Sie auch, dass der Iterator, wenn ein Element gelöscht werden soll.

Wenn der sortierte Vektor ohne Duplikate erforderlich ist, würde der folgende Code das Ergebnis anzeigen:

für (int i = 0; iCout<
Cout<Das nächste Codesegment verwendet den ursprünglichen Vektor und die Karte, um die Duplikate im ursprünglichen Vektor zu löschen:

für (Vector :: Iterator iter = vtro.Start(); Iterif (mp [*iter] == 1)
Vtro.löschen (iter);
Iter--;

if (mp [*iter] == -1)
MP [*iter] = 1;

Der Grund für die Auswahl von -1 und 1 anstelle von 0 und 1 ist, dass der Standardwert (fehlt) dieser Karte 0 beträgt. Dies vermeidet die Verwirrung mit den Elementen, die überhaupt nicht doppelt sind. Eine gewöhnliche For-Schleife wie folgt kann den endgültigen (reduzierten) ursprünglichen Vektor ausdrucken:

für (int i = 0; iCout<
Cout<Die Eingabe des Programms lautet:

'E', 'g', 'ich', 'e', ​​'a', 'e', ​​'c', 'a', 'c'

Die Ausgabe des Programms ist:

A c e g i
E g i a c

Die erste Zeile des Ausgangs ist der sortierte Eingang ohne Duplikate. Die zweite Zeile ist die Eingabe in der angegebenen Reihenfolge, wobei die Duplikate entfernt werden.

Abschluss

Um Duplikate von einem C ++-Vektor zu entfernen, kann die Brute-Force-Methode verwendet werden. Diese Methode ist normalerweise langsam. Dem Leser wird empfohlen, die Sort-and-Compare-Methode, die normalerweise schnell für seine kommerzielle Arbeit ist, zu verwenden. Beide Methoden wurden oben erklärt.