Wie bekomme ich Zeichen, die für zwei Vektoren in C ++ üblich sind?

8

Ich versuche, zwei Vektorobjekte zu vergleichen und gebe einen einzelnen Vektor zurück, der alle Zeichen enthält, die in beiden Vektoren erscheinen.

Wie würde ich darüber gehen, ohne eine schrecklich komplexe manuelle Methode zu schreiben, die jedes Zeichen im ersten Vektor mit jedem Zeichen im zweiten Vektor vergleicht und ein if benutzt, um es einem dritten Vektor hinzuzufügen (der zurückgegeben würde) Übereinstimmung.

Vielleicht ist mein Mangel an echten Erfahrungen mit Vektoren dafür verantwortlich, dass dies schwieriger wird, als es wirklich ist, aber ich vermute, dass es einen einfacheren Weg gibt, den ich durch das Suchen nicht finden konnte.

    
Drake 08.03.2010, 19:29
quelle

7 Antworten

9

Ich denke, Sie suchen std::set_intersection . Die Quellvektoren müssen jedoch sortiert sein. Wenn Ihnen die Reihenfolge Ihres Ausgabevektors egal ist, können Sie sie immer auf sortierten Kopien Ihrer Quellvektoren ausführen.

Und übrigens, der manuelle naive Weg ist nicht schrecklich komplex. Bei zwei Quellvektoren s1 und s2 und einem Zielvektor dest könnten Sie etwas schreiben, das so aussieht:

%Vor%

Sie haben viele Optionen für den Schritt find abhängig von Ihrer Wahl der Datenstruktur.

    
Michael Kristofik 08.03.2010, 19:34
quelle
3

Wenn ich dies auf zwei unsortierten Vektoren (ohne Bibliothekshilfe) tun müsste, würde ich alle Elemente von eins zu einer Hashtabelle hinzufügen und dann die zweite nachschlagen - sollte effizienter sein als beide zu sortieren listet auch zuerst auf.

    
Bill K 08.03.2010 19:44
quelle
2
%Vor%     
dcp 08.03.2010 19:40
quelle
1

Verwenden Sie set_intersection . Hier ist ein funktionierendes Beispiel:

%Vor%     
John Dibling 08.03.2010 19:44
quelle
1

Dies reicht nicht weit über den Standard-Char-Typ hinaus (vielleicht zu Unicode, je nach Anwendung), aber wenn Sie daran interessiert sind, dies in O (n) Zeit zu tun, sollte dies funktionieren.

%Vor%     
andand 08.03.2010 22:10
quelle
0

Da sich aus Ihrer späteren Frage herausstellt, interessieren Sie sich eigentlich nur für 26 Zeichen:

%Vor%

Tatsächlich ist ein bitset<UCHAR_MAX> auf fast allen Architekturen klein. Achten Sie nur auf diese DSPs mit 32-Bit-Zeichen und seien Sie vorsichtig, diese Technik an wchar_t anzupassen.

Mit BOOST_FOREACH sieht der Code sogar vernünftig aus:

%Vor%     
Steve Jessop 10.03.2010 01:10
quelle
-3

Vielleicht sollten Sie std :: strings anstelle von Vektoren verwenden, wenn Sie Zeichen in ihnen haben? Strings haben viele Funktionen zum Suchen usw.

    
Tronic 08.03.2010 19:33
quelle

Tags und Links