einen STL-Vektor, Ausgabe nur die Duplikate in sortierter Reihenfolge gegeben, zum BeispielWie man nur Duplikate effizient hält?
INPUT : { 4, 4, 1, 2, 3, 2, 3 }
OUTPUT: { 2, 3, 4 }
Der Algorithmus ist trivial, aber das Ziel ist es so effizient wie std zu machen :: einzigartig(). Meine naive Implementierung modifiziert den Behälter an Ort und Stelle:
Meine naive Implementierung:
void not_unique(vector<int>* pv)
{
if (!pv)
return;
// Sort (in-place) so we can find duplicates in linear time
sort(pv->begin(), pv->end());
vector<int>::iterator it_start = pv->begin();
while (it_start != pv->end())
{
size_t nKeep = 0;
// Find the next different element
vector<int>::iterator it_stop = it_start + 1;
while (it_stop != pv->end() && *it_start == *it_stop)
{
nKeep = 1; // This gets set redundantly
++it_stop;
}
// If the element is a duplicate, keep only the first one (nKeep=1).
// Otherwise, the element is not duplicated so erase it (nKeep=0).
it_start = pv->erase(it_start + nKeep, it_stop);
}
}
Wenn Sie diese effizienter zu gestalten, elegant machen können oder allgemeine, lassen Sie es mich wissen. Zum Beispiel ein benutzerdefinierter Sortieralgorithmus oder Kopieren von Elementen in der zweiten Schleife, um den Aufruf von radi() zu eliminieren.
std :: unique() setzt voraus, dass der Vektor sortiert ist. Können Sie Einzelheiten dazu nennen, warum Sie meinen, dass Ihr Code weniger effizient ist? –
Nur um zu wählen, was Sie haben: Nehmen Sie den Container als Referenz. Es gibt keinen Grund, hier einen Zeiger zu verwenden (und Sie sind beispielsweise nicht sicher mit keep_duplicates (0)). Sowohl der Code innerhalb der Funktion als auch der Aufruf der Funktion würden ein wenig vereinfacht. :) – GManNickG
Zur Verdeutlichung: Wenn der Eingang '{1, 1, 1}' ist, sollte der Ausgang '{1}' oder '{1, 1}' sein? – rlbond