Überprüfen, ob alle Elemente eines Vektors in C ++ gleich sind
Wenn ich einen Vektor, der die Werte und überprüfen möchten, dass Sie alle die gleiche, was ist der beste Weg, dies zu tun in C++ effizient? Wenn ich die Programmierung in anderen Sprachen wie R einer Art, wie mein Verstand springt, ist wieder nur die eindeutigen Elemente des Containers und dann, wenn die Länge der einzigartigen Elemente ist mehr als 1, ich kenne al die Elemente können nicht die gleichen sein. In C++ kann dies wie folgt vorgenommen:
//build an int vector
std::sort(myvector.begin(), myvector.end());
std::vector<int>::iterator it;
//Use unique algorithm to get the unique values.
it = std::unique(myvector.begin(), myvector.end());
positions.resize(std::distance(myvector.begin(),it));
if (myvector.size() > 1) {
std::cout << "All elements are not the same!" << std::endl;
}
Aber das Lesen über das internet und SO, sehe ich die anderen Antworten so mit einer Gruppe oder der Algorithmus find_if. Also, was ist der effizienteste Weg, dies zu tun, und warum? Ich mir vorstellen, bei mir ist das nicht der beste Weg, da es sich um das Sortieren jedes element und dann ein ändern der Größe der Vektor - aber vielleicht bin ich falsch.
Dank,
Ben.
InformationsquelleAutor der Frage Ward9250 | 2013-11-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, um die Verwendung von std::sort. Es kann getan werden, einfacher
InformationsquelleAutor der Antwort Vlad from Moscow
können Sie
std::equal
Dieser vergleicht jedes element mit dem vorherigen.
Edit:
Bezüglich der Leistungsfähigkeit, nach dem Test mit 100m-Elemente fand ich heraus, dass in Visual Studio 2015
version 1
ist etwa doppelt so schnell wieversion 2
. Dies ist da die neuesten compiler für vs2015 verwendet sse-Instruktionen in c++ - std-Implementierungen wenn Sie int, float , usw..wenn Sie _mm_testc_si128 erhalten Sie eine ähnliche Leistung zu
std::equal
InformationsquelleAutor der Antwort Raxvan
Keine Einschränkungen auf dem Vektor, Sie haben zu Durchlaufen, der Vektor mindestens einmal, egal, der Ansatz. So wählen Sie einfach das erste element und überprüfen Sie, dass alle anderen gleich sind.
InformationsquelleAutor der Antwort Luchian Grigore
Sortieren ist O(NlogN) Aufgabe.
Dies ist leicht lösbar in O(N), so dass Sie Ihre aktuelle Methode ist schlecht.
Einem einfachen O(N) wäre als Luchian Grigore andeutet, Durchlaufen Sie den Vektor, der nur einmal, und vergleichen Sie jedes element auf das erste element.
InformationsquelleAutor der Antwort RichardPlunkett
InformationsquelleAutor der Antwort iNFINITEi
Während die asymptotische Komplexität von
std::unique
linear ist, die tatsächlichen Kosten der Bedienung, ist wahrscheinlich viel größer, als Sie brauchen, und es ist ein inplace-Algorithmus (es werden die Daten ändern, wie es geht).Der Schnellste Ansatz ist zu vermuten, dass, wenn der Vektor enthält ein einzelnes element, ist es per definitionem eindeutig. Wenn der Vektor enthält mehr Elemente, dann müssen Sie nur überprüfen, ob alle von Ihnen sind genau gleich dem ersten. Dafür müssen Sie nur das erste element, das sich von der ersten unterscheidet, beginnt die Suche ab der zweiten. Wenn es ein solches element, die Elemente sind nicht eindeutig.
Ist mit C++14 syntax, in ein C++11-toolchain können Sie die korrekte type in lambda. In C++03 könntest du eine Kombination von
std::not
std::bind1st/std::bind2nd
undstd::equal
an die Stelle der lambda.Die Kosten dieses Ansatzes ist
distance(start,different element)
Vergleiche und keine Kopien. Erwartet und im schlechtesten Fall lineare Kosten in der Anzahl der Vergleiche (und keine Kopien!)InformationsquelleAutor der Antwort David Rodríguez - dribeas
In Ihrem speziellen Fall iteriert Vektor-element und die Suche nach einem anderen element aus der erste würde reichen. Sie können sogar das Glück, zu stoppen, bevor die Bewertung aller Elemente im Vektor. (Eine while-Schleife verwendet werden könnte, aber ich geklebt mit einer for-Schleife aus Gründen der Lesbarkeit)
In Fall, dass Sie wollen wissen, wie viele verschiedene Werte der Vektor enthält, könnten Sie erstellen und überprüfen Sie die Größe, um zu sehen, wie viele verschiedene Werte im inneren:
InformationsquelleAutor der Antwort Julien B.
Vielleicht so etwas wie dieses. Es durchläuft die vector nur einmal und nicht Durcheinander mit der Vektor-Inhalte.
Wenn die Werte in dem Vektor sind etwas anderes als die Art, die Sie implementieren müssen, um Gleichheits-operator.
InformationsquelleAutor der Antwort Rostfrei
Können Sie einfach
std::count
zählen alle Elemente, die mit dem Start-element:InformationsquelleAutor der Antwort Tas
Können Sie FunctionalPlus(https://github.com/Dobiasd/FunctionalPlus):
InformationsquelleAutor der Antwort Jee lee
der Vollständigkeit halber, weil es ist noch nicht das effizienteste, können Sie mit std::einmalig in ein effizienter Weg, um zu entscheiden, ob alle Mitglieder sind gleich, aber Vorsicht, dass nach der Verwendung von std::unique diese Weise werden die container nutzlos ist:
InformationsquelleAutor der Antwort stefaanv
Anderen Ansatz mit
C++ 14
:ist auch um N.
InformationsquelleAutor der Antwort Batato