Sortierreihenfolge im STL-map und set
Wie werden die benutzerdefinierten Objekte sortiert anzeigen und einstellen?
Soweit ich weiß, anzeigen/set Sortiert Assoziative Container: es werden die Elemente eingefügt werden, sortiert werden basierend auf dem Schlüssel, dass es hält.
Aber Karte und intern verwenden operator >
Sortieren Ihre Elemente.
Aus der SGI-Website, habe ich die folgenden Beispiele:
struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
int main()
{
map<const char*, int, ltstr> months;
months["january"] = 31;
months["february"] = 28;
months["march"] = 31;
months["april"] = 30;
months["may"] = 31;
months["june"] = 30;
months["july"] = 31;
months["august"] = 31;
months["september"] = 30;
months["october"] = 31;
months["november"] = 30;
months["december"] = 31;
cout << "june -> " << months["june"] << endl;
map<const char*, int, ltstr>::iterator cur = months.find("june");
map<const char*, int, ltstr>::iterator prev = cur;
map<const char*, int, ltstr>::iterator next = cur;
++next;
--prev;
cout << "Previous (in alphabetical order) is " << (*prev).first << endl;
cout << "Next (in alphabetical order) is " << (*next).first << endl;
}
Im obigen Beispiel, wie die Werte sortiert?
Edit: Code verschoben von Kommentar:
typedef map <string, int> Mint ;
int main()
{
string Name ;
int Marks;
Mint Grade;
for (int i = 0; i<4; i++)
{
cin>> Name ;
cin >> Marks;
Grade [Name] = Marks ;
}
Mint :: iterator iter;
for( iter = Grade.begin(); iter != Grade.end(); iter++)
cout<< (*iter).first<<“ \t ” <<(*iter).second<<“\n” ;
return 0;
}
Wie würden die Werte sortiert werden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
std::map
verwendet einen Funktor zum Sortieren von Elementen. Standardmäßig ist esstd::less<Key>
, die verwendetoperator<
. In deinem Beispiel gibt es einen Benutzer-definierten Funktorltstr
die helfen, Sortieren Sie Elemente nach Ihrer Tasten in alphabetischer Reihenfolge.operator<
am Ende, wenn Sie nicht angegeben template-argument explizit.Zunächst
operator<
wird standardmäßig verwendet und nichtoperator>
. In Ihrem Fall ist, übergeben Sie einen benutzerdefinierten Vergleich-Funktion durch die übergabe der Dritten template-parameter während der Erstellung der map-Objekt. Während Sie jedes element auf der Karte, dieser Vergleich funktors verwendet wird, um zu bestimmen, die relative Reihenfolge der Objekte in der map, d.h. es wird verwendet, zu vergleichen mit den Tasten. Zum Beispiel, wenn Sie tunmonths["february"] = 28;
, Landkarte vergleicht die Tasten "Januar" und "Februar". Da wir gerade einen string vergleichen, dieser Vergleich gibt einen Wert größer als 0 ist. Dieser Wert wird verwendet, um die position der Taste "Februar" in Bezug auf "Januar".