Frage

Da es keine .resize () Member-Funktion in C ++ std :: map Ich habe mich gefragt, wie man eine std :: map mit höchstens n Elementen erhalten.

Die naheliegende Lösung ist eine Schleife von 0 bis n zu erzeugen und den n-te Iterator als ersten Parameter für std :: erase ().

Ich frage mich, ob es eine Lösung gibt, die nicht die Schleife muss (zumindest nicht in meinem Benutzercode) und „der STL Weg zu gehen“ ist.

War es hilfreich?

Lösung

Sie können std::advance( iter, numberofsteps ) dafür.

Andere Tipps

Universal-Lösung für nahezu jeden Behälter, wie std :: list, std :: map boost :: multi_index. Sie müssen nur die Größe Ihrer Karte überprüfen.

template<class It>
It myadvance(It it, size_t n) {
   std::advance(it, n);
   return it;
}

template<class Cont>
void resize_container(Cont & cont, size_t n) {
    cont.erase(myadvance(cont.begin(), std::min(n, cont.size())), 
                 cont.end());
}

Der richtige Weg dafür ist std :: Voraus zu verwenden. Aber hier ist eine lustige (langsam) Art und Weise ermöglichen, ‚den Einsatz auf der Karte die Größe‘. Allgemeiner gesagt, kann diese Art von Trick für andere Dinge verwendet werden, auf Vektor arbeiten, aber nicht auf der Karte.

map<K,V> m; //your map
vector< pair<K,V> > v(m.begin(), m.end());
v.resize(n);
m = map<K,V>(v.begin(),v.end());

A std :: map ist keine Liste. Es gibt keine "ersten n" Elemente.

BTW: Iteratoren ungültig, wenn der Behälter geändert wird

.

Wenn Sie wirklich eine kleinere Karte brauchen Sie obwohl es durchlaufen und alle Elemente der n-ten in eine neue Karte addieren.

Warum wollen Sie eine Karte, um die Größe?

Die Elemente in einer Karte nicht in beliebiger Reihenfolge gespeichert werden - die erste ‚n‘ bedeutet nicht wirklich etwas

edit:
Interessanter std :: map hat einen Auftrag haben, nicht sicher, wie nützlich dieses Konzept ist.
Sind die Einträge in der gleichen Reihenfolge, um als Schlüssel?
Was bedeutet das? Wenn Sie Namen eingegeben von SSN haben, dass die Namen bedeuten in SSN numerischer Reihenfolge gespeichert?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top