Computers

Sortieren von Objekten in der C ++ - Liste durch Vergleichsprädikat

Autor: Laura McKinney
Erstelldatum: 8 April 2021
Aktualisierungsdatum: 1 April 2025
Anonim
Sortieren von Objekten in der C ++ - Liste durch Vergleichsprädikat - Computers
Sortieren von Objekten in der C ++ - Liste durch Vergleichsprädikat - Computers

Inhalt

Ich bin ein Softwareentwickler. Ich arbeite seit 15 Jahren mit C ++ -, MFC- und .net-Technologien. Ich mag Videospiele und lese Bücher.

Was ist ein Vergleichsprädikat?

Wir wissen, dass die Sortierung durchgeführt werden kann, indem zwei Elemente verglichen und die Elemente entweder in aufsteigender oder absteigender Reihenfolge angeordnet werden. Für jede Programmier-API ist dies eine einfache Aufgabe, wenn die Elemente unter Standarddatentypen wie Ganzzahlen, Gleitkommazahlen usw. fallen. Wenn der Typ nun benutzerdefiniert ist, z. In der Klasseninstanz weiß die API möglicherweise nicht, wie die Elemente sortiert werden sollen. Oder selbst wenn es so ist, kann es nicht so sein, wie wir es wollen. Und hier ist die Notwendigkeit für die "Prädikat vergleichen" kommt ins Bild.

In diesem Artikel erstellen wir eine Abteilungsklasse und sortieren die Instanzen anhand einiger Vergleichsprädikate. Lass uns anfangen.

Die Abteilungsklasse: Erklären der C ++ - Listensortierung

Der folgende Code zeigt die gesamte Abteilungsklasse:

// ListSort 01: Abteilungsklasse für diese Hub-Klasse Abteilung {privat: //1.1: Private Mitglieder int m_DeptID; Zeichenfolge m_DeptName; int m_NumberOfStaffs; public: //1.2: Department Class Constructor Department (int id, Zeichenfolgenname, int total_emp) {m_DeptID = id; m_DeptName = name; m_NumberOfStaffs = total_emp; } //1.3: Getter-Funktionen int GetDeptId () {return m_DeptID; } int GetNumberOfStaffs () {return m_NumberOfStaffs; } //1.4: Druckinhalt der Abteilungsklasse void Print_Department () {cout "Abteilung -" m_DeptName "ID:" m_DeptID ", Total Staffs -" m_NumberOfStaffs endl; }};

Code-Snippet 1.1: Mitglieder

Die Abteilungsklasse besteht aus drei Mitgliedern, in denen die Abteilungs-ID, der Name und die Anzahl der von der Abteilung beschäftigten Mitarbeiter gespeichert werden. Dies wird im Code-Snippet 1.1 gezeigt


Code-Snippet 1.2: Abteilungskonstruktor

Der Konstruktor verwendet drei Parameter und verwendet diese übergebenen Parameter, um alle seine Mitglieder zu initialisieren. Beachten Sie, dass unsere Klasse keine anderen Konstruktoren hat und es auch keinen Standardkonstruktor gibt. Dadurch wird sichergestellt, dass alle Datenelemente während der Erstellung selbst mit den gültigen Daten initialisiert werden.

Code-Snippet 1.3: Getter-Funktionen

Wir haben zwei Getter-Funktionen angegeben, die die privaten Mitglieder m_DeptID und m_NumberOfStaffs zurückgeben.

Code-Snippet 1.4: Drucken der Abteilungsinformationen

Das Print_Department () -Mitglied der Department-Klasse druckt die Department-Daten in das Konsolenausgabefenster. Hier verwenden wir das C ++ iosteam, um die Mitglieder zusammen mit der verketteten Zeichenfolge aufzulisten. Hier geht es um die Abteilungsklasse. Lassen Sie uns einige der globalen Funktionen untersuchen, die sich mit diesen Abteilungsklasseninstanzen und der C ++ - Standardliste befassen.

Hinzufügen einer Abteilungsklasseninstanz zur C ++ - Liste

Die globale Funktion Add_ListElements verwendet die C ++ - Standardliste als Parameter und fügt die Abteilungsinstanzen hinzu. Funktionscode ist unten:


// ListSort 02: Funktion zum Verschieben einiger Werte in die Liste void Add_ListElements (listDepartment> & listParam) {//2.1: Löschen Sie die Liste listParam.clear (); //2.2: Abteilungsobjekte erstellen const Abteilung D1 (3, "Zivil", 20); const Abteilung D2 (1, "Mechanisch", 60); const Abteilung D3 (5, "Elektrik", 22); const Department D4 (4, "Chemical", 34); const Department D5 (2, "Computer Science", 35); //2.3: Abteilungsobjekte zur Liste hinzufügen listParam.push_back (D1); listParam.push_back (D2); listParam.push_back (D3); listParam.push_back (D4); listParam.push_back (D5); }}

Code-Snippet 2.1

Immer wenn wir Add_ListElements () aufrufen, sollten der bereitgestellten C ++ - Liste zu Demozwecken fünf Standardabteilungen hinzugefügt werden. Daher löschen wir zuerst die Liste, indem wir die Standardliste aufrufen klar() Funktion.

Code-Snippet 2.2

Es werden fünf Abteilungsobjekte erstellt, und es wird darauf hingewiesen, dass alle Instanzen konstant gehalten werden, da wir die Instanzmitglieder nicht ändern und nur diese Demoabteilungen sortieren.


Code-Snippet 2.3

Wir speichern die Abteilungen einzeln in der C ++ - Standardliste, indem wir die verwenden push_back () Funktionsaufruf.

4. Iterieren von Abteilungsklasseninstanzen in der C ++ - Liste

Die Print_List () wird geschrieben, um die bereitgestellte Liste zu durchlaufen, und gibt Informationen zur Abteilungsklasse im Konsolenfenster aus. In jeder Iteration rufen wir die Instanz der Abteilungsklasse ab und rufen das Mitglied Print_Department () auf, um die ID, den Namen usw. der Abteilungsinformationen auszudrucken. Die folgende Funktion:

// ListSort 03: Funktion zum Drucken der Werte in List void Print_List (listDepartment> listParam) {listDepartment> :: iterator listItr; printf (" nDer Inhalt der Listen ist: n"); for (listItr = listParam.begin (); listItr! = listParam.end (); listItr ++) {( * listItr) .Print_Department (); }}

Vergleichen Sie Prädikate für das Sortieren von Abteilungen in der Liste

Die Standardliste "Sortieren()" Die Funktion kann keine benutzerdefinierten C ++ - Typen sortieren, z. B. Strukturen, Klassenobjekte usw. Durch "Prädikate vergleichen"können wir der Funktion Sort () beibringen, wann sie den Austausch durchführen soll.

Das Vergleichsprädikat erwartet zwei Parameter und gibt einen Booleschen Wert zurück. Nehmen wir an, die Parameter sind First und Second, und der Körper des Prädikats sollte sagen, dass diese Reihenfolge richtig oder falsch ist. Wenn wir sagen, dass die Reihenfolge richtig ist, sollten wir true zurückgeben, andernfalls false. Wenn das Prädikat false zurückgibt, weiß die sort () - Funktion der Standardliste, dass Second und First ausgetauscht werden müssen, damit Second in der Sortierreihenfolge an erster Stelle steht.

Beachten Sie, dass der erste und der zweite Parameter mit dem Datentyp des Containers übereinstimmen sollten (in diesem Beispiel ist es Abteilung).

5.1 Prädikat vergleichen - Nach Abteilungs-ID sortieren

Unsere erste Prädikatfunktion gibt an, wie die Abteilung nach ihrer Abteilungs-ID sortiert wird. Schauen Sie sich die Prädikatfunktion unten an:

// ListSort 04a: Prädikatfunktion für sory durch // Abteilungs-IDs in aufsteigender Reihenfolge bool Compare_IDS_Predicate_Asc (Abteilung zuerst, Abteilung weiter) {// Erstes Argument bleibt zuerst (Rückgabe true) if (First.GetDeptId () Next.GetDeptId ()) return true; // Erstes Argument geht weiter (Swap) (Rückgabe false) if (First.GetDeptId ()> Next.GetDeptId ()) return false; // a == b. Erstes Argument Bleibt zuerst // (kein Austausch erforderlich) return true; }}

Im obigen Code erfahren Sie, wie Sie die Abteilungs-ID in aufsteigender Reihenfolge sortieren. Wenn der Parameter First niedriger als der Parameter Second ist, möchten wir ihn nicht austauschen und geben daher true zurück. Wenn der erste Parameter höher als der zweite ist, geben wir eine falsche Anweisung zurück, dass ein Austausch erforderlich ist. Wenn beide Parameter First und Second den gleichen Wert haben, geben wir false zurück und geben an, dass kein Austausch erforderlich ist. Wir können sogar true zurückgeben, aber der Austausch hat hier keine Auswirkung.

5.2 Prädikat vergleichen - Nach Anzahl der Mitarbeiter sortieren

Das zweite Prädikat wird geschrieben, um die Sortierung in absteigender Reihenfolge durchzuführen. Beachten Sie, wie der Operator "" und ">" verwendet wird und wie unterschiedlich er die vorherige Prädikatfunktion ausführt, die die Sortierung in aufsteigender Reihenfolge durchführt. Der Code für das zweite Prädikat ist unten angegeben:

// ListSort 04b: Prädikatfunktion zum Sortieren nach // NumberOf Employees - absteigend bool Compare_TotEmps_Predicate_Desc (Abteilung zuerst, Abteilung als nächstes) {// Erstes Argument bleibt zuerst (Rückgabe true) if (First.GetNumberOfStaffs ()> Next.GetNumberOfStaffs ()) return true; // Erstes Argument geht weiter // (Swap) (Rückgabe false) if (First.GetNumberOfStaffs () Next.GetNumberOfStaffs ()) return false; // a == b. Das erste Argument bleibt // first (kein Austausch erforderlich) return true; }}

OK. Jetzt ist es an der Zeit, die C ++ - Liste zu erstellen, die Abteilungsinstanzen darin zu speichern und unsere Prädikatfunktionen zu sortieren. Lasst uns weitermachen!

C ++ Prädikat in Aktion vergleichen

OK. Lassen Sie uns zunächst die Liste vorbereiten und im Konsolenausgabefenster drucken. Zuerst haben wir unsere globale Funktion Add_ListElements () verwendet, indem wir die C ++ - Standardliste als Parameter übergeben haben.Die Funktion packt fünf gleiche Abteilungen in die übergebene Liste. Als nächstes liefern wir eine abteilungsgepackte Liste an die globale Funktion Print_List (), um den Inhalt der Liste zu drucken. Der Code ist unten:

//3.1 Liste und Iterator erstellen listDepartment> theList; Add_ListElements (theList); Print_List (theList);

Zu diesem Zeitpunkt haben wir eine C ++ - Standardliste mit fünf Abteilungsobjekten. Dies ist im folgenden Bild dargestellt:

Als nächstes sortieren wir Abteilungsobjekte nach ihrer ID. Um die Abteilung nach ID zu sortieren, übergeben wir die Prädikatfunktion Compare_IDS_Predicate_Asc zu "Sortieren()" Methode der Liste. Jetzt weiß die Sortiermethode, wie das Abteilungsobjekt sortiert wird. Es durchläuft die C ++ - Liste und verwendet die Prädikatfunktion Compare_IDS_Predicate_Asc um die Reihenfolge zwischen nebeneinander liegenden Abteilungsobjekten in der Liste zu bestimmen. Nach dem Aufruf von Sort () werden die Abteilungen in den Listen in Aufsteigend nach Abteilungs-IDs sortiert, und wir drucken die Liste im Konsolenausgabefenster.

Auf die gleiche Weise wird die Prädikatfunktion verwendet Compare_TotEmps_Predicate_Desc, Wir rufen die sort () -Methode erneut auf. Dieses Mal wird die Liste nach der Anzahl der Mitarbeiter in der Abteilung in absteigender Reihenfolge sortiert. Das Code-Snippet ist unten:

//3.2 Sortieren der Liste nach IDs printf (" nSortieren der Liste nach ID: n"); theList.sort (Compare_IDS_Predicate_Asc); Print_List (theList); //3.3 Sortieren der Liste nach Abteilung printf (" nSortieren der Liste nach Anzahl der Mitarbeiter n"); theList.sort (Compare_TotEmps_Predicate_Desc); Print_List (theList);

Die zwei Sortiervorgänge werden wie folgt dargestellt:

Der vollständige Code Beispiel - C ++ List Sort () mit Vergleichsprädikaten

// ListSort00: Erforderlich Enthält #include stdio.h> #include conio.h> #include iostream> #include list> #include string> using namespace std; // ListSort 01: Abteilungsklasse für diese Hub-Klasse Abteilung {privat: //1.1: Private Mitglieder int m_DeptID; Zeichenfolge m_DeptName; int m_NumberOfStaffs; public: //1.2: Department Class Constructor Department (int id, Zeichenfolgenname, int total_emp) {m_DeptID = id; m_DeptName = name; m_NumberOfStaffs = total_emp; } //1.3: Getter-Funktionen int GetDeptId () {return m_DeptID; } int GetNumberOfStaffs () {return m_NumberOfStaffs; } //1.4: Druckinhalt der Abteilungsklasse void Print_Department () {cout "Abteilung -" m_DeptName "ID:" m_DeptID ", Total Staffs -" m_NumberOfStaffs endl; }}; // ListSort 02: Funktion zum Verschieben einiger Werte in die Liste void Add_ListElements (listDepartment> & listParam) {//2.1: Löschen Sie die Liste listParam.clear (); //2.2: Abteilungsobjekte erstellen const Abteilung D1 (3, "Zivil", 20); const Abteilung D2 (1, "Mechanisch", 60); const Abteilung D3 (5, "Elektrik", 22); const Department D4 (4, "Chemical", 34); const Department D5 (2, "Computer Science", 35); //2.3: Abteilungsobjekte zur Liste hinzufügen listParam.push_back (D1); listParam.push_back (D2); listParam.push_back (D3); listParam.push_back (D4); listParam.push_back (D5); } // ListSort 03: Funktion zum Drucken der Werte in List void Print_List (listDepartment> listParam) {listDepartment> :: iterator listItr; printf (" nDer Inhalt der Listen ist: n"); for (listItr = listParam.begin (); listItr! = listParam.end (); listItr ++) {( * listItr) .Print_Department (); }} // ListSort 04a: Prädikatfunktion für // Abteilungs-IDs in aufsteigender Reihenfolge bool Compare_IDS_Predicate_Asc (Abteilung zuerst, Abteilung weiter) {// Erstes Argument bleibt zuerst (Rückgabe true) if (First.GetDeptId () Next.GetDeptId ( )) return true; // Erstes Argument geht weiter (Swap) (Rückgabe false) if (First.GetDeptId ()> Next.GetDeptId ()) return false; // a == b. Erstes Argument Bleibt zuerst // (kein Austausch erforderlich) return true; } // ListSort 04b: Prädikatfunktion zum Sortieren nach // NumberOf Employees - absteigend bool Compare_TotEmps_Predicate_Desc (Abteilung zuerst, Abteilung als nächstes) {// Erstes Argument bleibt zuerst (Rückgabe true) if (First.GetNumberOfStaffs ()> Next.GetNumberOfStaffs () ) return true; // Erstes Argument geht weiter // (Swap) (Rückgabe false) if (First.GetNumberOfStaffs () Next.GetNumberOfStaffs ()) return false; // a == b. Das erste Argument bleibt // first (kein Austausch erforderlich) return true; } // ListSort 05: Loslassen Sortieren der Abteilungsliste void main () {//3.1 Liste und Iteratorliste erstellenDepartment> theList; Add_ListElements (theList); Print_List (theList); //3.2 Sortieren der Liste nach IDs printf (" nSortieren der Liste nach ID: n"); theList.sort (Compare_IDS_Predicate_Asc); Print_List (theList); //3.3 Sortieren der Liste nach Abteilung printf (" nSortieren der Liste nach Anzahl der Mitarbeiter n"); theList.sort (Compare_TotEmps_Predicate_Desc); Print_List (theList); _getch (); }}

Die Ausgabe des Programmergebnisses ist unten dargestellt:

Dieser Artikel ist genau und nach bestem Wissen des Autors. Der Inhalt dient nur zu Informations- oder Unterhaltungszwecken und ersetzt nicht die persönliche Beratung oder professionelle Beratung in geschäftlichen, finanziellen, rechtlichen oder technischen Angelegenheiten.

Ihnen Empfohlen

Interessante Publikationen.

So beheben Sie die Codierung beschädigter Zeichen (beschädigter Text) in Microsoft Word
Computers

So beheben Sie die Codierung beschädigter Zeichen (beschädigter Text) in Microsoft Word

Neugierig in der Natur werde ich alle erfor chen, wa mich intere iert.Per onen, die au giebig mit Nur-Text-Dateien arbeiten, denen die Dateierweiterung .TXT angehängt i t, toßen gelegentlich...
Verwendung der VLookup-Funktion in Microsoft Excel
Computers

Verwendung der VLookup-Funktion in Microsoft Excel

Ich bin ein ehemaliger Mathematiklehrer und Inhaber von DoingMath . Ich er telle viele Arbeit blätter und andere Re ourcen und lerne dabei viele Formatierung trick .Die VLOOKUP-Funktion i t ein &...