Heim Datenbank MySQL-Tutorial 由2个值组合成key的STL map排序问题

由2个值组合成key的STL map排序问题

Jun 07, 2016 pm 03:08 PM
key map stl 合成 排序 问题

在C中,map是典型的关联容器或者叫映射容器(associative container),其中的每一个元素都是由key-value这样成对出现的内容组成的,比如学号和学生之类具有一一对应关系的情形,学号可以作为key,学生对象可以作为key所对应的value。很显然这种情况下的key只

在C++中,map是典型的关联容器或者叫映射容器(associative container),其中的每一个元素都是由key-value这样成对出现的内容组成的,比如学号和学生之类具有一一对应关系的情形,学号可以作为key,学生对象可以作为key所对应的value。很显然这种情况下的key只有一个值,但是,在实际工作中,我们可能会经常需要使用多个值组合起来作为key的情况,比如我们要按照学生的视力和身高进行排序,以决定学生的座位排在前面还是后面,而且还是假定要用map来解决这样的问题(当然,这样的问题有很多其它的解决办法),那应该怎么办呢?

 

(1)  单值作为key的情形

我们知道map在缺省状态下,其数据是按照key的升序进行排列的。假定我们有一个Student类,声明如下:

[cpp] view plaincopy

  1. class Student  
  2. {  
  3. private:  
  4.          int id;                  // 学号  
  5.          string name;             // 姓名  
  6.          float eyesight;          // 视力  
  7.          float height;            // 身高  
  8.          float chinese;           // 语文成绩  
  9.          float english;           // 英文成绩  
  10.          float math;              // 数学成绩  
  11. public:  
  12.          Student(int id, string name,floateyesight, float height,float chinese, float english,float math)  
  13.          {  
  14.                    this->id = id;  
  15.                    this->name = name;  
  16.                    this->eyesight = eyesight;  
  17.                    this->height = height;  
  18.                    this->chinese = chinese;  
  19.                    this->english = english;  
  20.                    this->math = math;  
  21.          }  
  22.    
  23.          int get_id()  
  24.          {  
  25.                    return id;  
  26.          }  
  27.    
  28.          string get_name()  
  29.          {  
  30.                    return name;  
  31.          }  
  32.    
  33.          float get_eyesight()  
  34.          {  
  35.                    return eyesight;  
  36.          }  
  37.    
  38.          float get_height()  
  39.          {  
  40.                    return height;  
  41.          }  
  42.    
  43.          float get_chinese()  
  44.          {  
  45.                    return chinese;  
  46.          }  
  47.    
  48.          float get_english()  
  49.          {  
  50.                    return english;  
  51.          }  
  52.    
  53.          float get_math()  
  54.          {  
  55.                    return math;  
  56.          }  
  57. };  
 

那么下面的程序:

[cpp] view plaincopy

  1. int main(int argc,char**argv)  
  2. {  
  3.        mapint, Student> stu_map;    // int作为key的类型,Student作为value的类型  
  4.        stu_map.insert(make_pair(4,Student(4, "Dudley",1.1f, 170.2f, 90.5f, 89.5f, 93.0)));  
  5.        stu_map.insert(make_pair(3,Student(3, "Chris", 1.1f, 163.4f, 93.5f,90.0f, 83.5f)));  
  6.        stu_map.insert(make_pair(2,Student(2, "Bob", 1.5f, 166.6f, 86.0f,98.5f, 85.0f)));  
  7.        stu_map.insert(make_pair(1,Student(1, "Andrew", 1.5f, 173.2f, 98.5f,100.0f, 100.f)));  
  8.    
  9.        mapint, Student>::iterator iter;  
  10.        for(iter = stu_map.begin(); iter != stu_map.end();++iter)  
  11.        {  
  12.               coutfirst "\t"second.get_name() 
  13.        }  
  14.    
  15.        return 0;  
  16. }  
 

就会按照学号的升序给出输出:

1          Andrew

2          Bob

3          Chris

4          Dudley

这是缺省的情形,如果要将学生的姓名按照学号的降序输出,那么仅需将上面main函数中的

mapint,Student> stu_map;改为

mapint,Student, greaterint> > stu_map;

以及

mapint,Student>::iterator iter;改为

mapint,Student, greaterint> >::iteratoriter;

即可。

 

其实,mapint,Student> stu_map;这是一种缺省的情况,它和

mapint,Student, lessint> > stu_map;是一样的。

 

(2) 多值组合作为key的情形

现在,我们来看看多个值组合起来作为key的情况,为此,我们需要为key定义一个类,如下:

[cpp] view plaincopy

  1. class key  
  2. {  
  3. public:  
  4.        float eyesight;  
  5.        float height;  
  6.    
  7.        key(float x, floaty):eyesight(x), height(y)  
  8.        {  
  9.        }  
  10.    
  11.        friend bool operator const key&);  
  12. };  
  13.    
  14. bool operator const key& key2)  
  15. {  
  16.        // 按eyesight升序 + height升序排列  
  17.        if(key1.eyesight != key2.eyesight)        
  18.               return (key1.eyesight 
  19.        else  
  20.               return (key1.height 
  21.         
  22.        // 按eyesight降序 + height降序排列  
  23.        //if(key1.eyesight != key2.eyesight)      
  24.        //     return(key1.eyesight > key2.eyesight);  
  25.        //else                                   
  26.        //     return(key1.height > key2.height);  
  27.    
  28.        // 按eyesight升序 + height降序排列  
  29.        //if(key1.eyesight != key2.eyesight)      
  30.        //     return(key1.eyesight   
  31.        //else                                   
  32.        //     return(key1.height > key2.height);  
  33.    
  34.        // 按eyesight降序 + height升序排列  
  35.        //if(key1.eyesight != key2.eyesight)      
  36.        //     return(key1.eyesight > key2.eyesight);  
  37.        //else                                   
  38.        //     return(key1.height   
  39. }  
 

再修改main函数如下:

[cpp] view plaincopy

  1. int main(int argc,char**argv)  
  2. {  
  3.        map stu_map;  
  4.    
  5.        Studentstu4(4, "Dudley",1.1f, 170.2f, 90.5f, 89.5f, 93.0);  
  6.        Studentstu3(3, "Chris", 1.1f, 163.4f, 93.5f,90.0f, 83.5f);  
  7.        Studentstu2(2, "Bob", 1.5f, 166.6f, 86.0f,98.5f, 85.0f);  
  8.        Studentstu1(1, "Andrew", 1.5f, 173.2f, 98.5f,100.0f, 100.f);  
  9.    
  10.        stu_map.insert(make_pair(key(stu4.get_eyesight(),stu4.get_height()), stu4));  
  11.        stu_map.insert(make_pair(key(stu3.get_eyesight(),stu3.get_height()), stu3));  
  12.        stu_map.insert(make_pair(key(stu2.get_eyesight(),stu2.get_height()), stu2));  
  13.        stu_map.insert(make_pair(key(stu1.get_eyesight(),stu1.get_height()), stu1));  
  14.    
  15.        map::iterator iter;  
  16.        for(iter = stu_map.begin(); iter != stu_map.end();++iter)  
  17.        {  
  18.              coutfirst.eyesight "\t"first.height  "\t" second.get_id()"\t" second.get_name() 
  19.        }  
  20.    
  21.        return 0;  
  22. }  

那么输出结果为:

1.1    163.4        3       Chris

1.1    170.2        4       Dudley

1.5    166.6        2       Bob

1.5    173.2        1       Andrew

从上面的输出,我们可以很明显地看到,是按照视力升序和升高升序输出的,另外三种可能的排序情况,也在类key的操作符“

 

(3)结论

1.通常我们不用STL algorithm中的sort函数,来对一个map进行排序,而对vector的元素进行排序则可以很方面地使用sort函数;

2.多值组合作为key的情况,需要我们自己定义一个key类,并在该类中重载操作符“


附两个值作为key的情况之完整的实验代码如下:

[cpp] view plaincopy

  1. #include   
  2. #include   
  3. #include   
  4. using namespace std;   
  5.    
  6. class key  
  7. {  
  8. public:  
  9.        float eyesight;  
  10.        float height;  
  11.    
  12.        key(float x, floaty):eyesight(x), height(y)  
  13.        {  
  14.        }  
  15.    
  16.        friend bool operator const key&);  
  17. };  
  18.    
  19. bool operator const key& key2)  
  20. {  
  21.        // 按eyesight升序 + height升序排列  
  22.        if(key1.eyesight != key2.eyesight)        
  23.               return (key1.eyesight 
  24.        else  
  25.               return (key1.height 
  26.         
  27.        // 按eyesight降序 + height降序排列  
  28.        //if(key1.eyesight != key2.eyesight)      
  29.        //     return(key1.eyesight > key2.eyesight);  
  30.        //else                                   
  31.        //     return(key1.height > key2.height);  
  32.    
  33.        // 按eyesight升序 + height降序排列  
  34.        //if(key1.eyesight != key2.eyesight)      
  35.        //     return(key1.eyesight   
  36.        //else                                   
  37.        //     return(key1.height > key2.height);  
  38.    
  39.        // 按eyesight降序 + height升序排列  
  40.        //if(key1.eyesight != key2.eyesight)      
  41.        //     return(key1.eyesight > key2.eyesight);  
  42.        //else                                   
  43.        //     return(key1.height   
  44. }  
  45.    
  46. class Student  
  47. {  
  48. private:  
  49.          int id;                   //学号  
  50.          string name;              // 姓名  
  51.          float eyesight;           //视力  
  52.          float height;             //身高  
  53.          float chinese;            //语文成绩  
  54.          float english;            //英文成绩  
  55.          float math;               //数学成绩  
  56. public:  
  57.        Student(int id, string name,floateyesight,float height,float chinese,float english,float math)  
  58.        {  
  59.               this->id = id;  
  60.               this->name = name;  
  61.               this->eyesight = eyesight;  
  62.               this->height = height;  
  63.               this->chinese = chinese;  
  64.               this->english = english;  
  65.               this->math = math;  
  66.        }  
  67.    
  68.        int get_id()  
  69.        {  
  70.               return id;  
  71.        }  
  72.    
  73.        string get_name()  
  74.        {  
  75.               return name;  
  76.        }  
  77.    
  78.        float get_eyesight()  
  79.        {  
  80.               return eyesight;  
  81.        }  
  82.    
  83.        float get_height()  
  84.        {  
  85.               return height;  
  86.        }  
  87.    
  88.        float get_chinese()  
  89.        {  
  90.               return chinese;  
  91.        }  
  92.    
  93.        float get_english()  
  94.        {  
  95.               return english;  
  96.        }  
  97.    
  98.        float get_math()  
  99.        {  
  100.               return math;  
  101.        }  
  102. };  
  103.    
  104. int main(int argc,char**argv)  
  105. {  
  106.        map stu_map;  
  107.    
  108.        Studentstu4(4, "Dudley",1.1f, 170.2f, 90.5f, 89.5f, 93.0);  
  109.        Studentstu3(3, "Chris", 1.1f, 163.4f, 93.5f,90.0f, 83.5f);  
  110.        Studentstu2(2, "Bob", 1.5f, 166.6f, 86.0f,98.5f, 85.0f);  
  111.        Studentstu1(1, "Andrew", 1.5f, 173.2f, 98.5f,100.0f, 100.f);  
  112.    
  113.        stu_map.insert(make_pair(key(stu4.get_eyesight(),stu4.get_height()), stu4));  
  114.        stu_map.insert(make_pair(key(stu3.get_eyesight(),stu3.get_height()), stu3));  
  115.        stu_map.insert(make_pair(key(stu2.get_eyesight(),stu2.get_height()), stu2));  
  116.        stu_map.insert(make_pair(key(stu1.get_eyesight(),stu1.get_height()), stu1));  
  117.    
  118.        map::iterator iter;  
  119.        for(iter = stu_map.begin(); iter != stu_map.end();++iter)  
  120.        {  
  121.              coutfirst.eyesight "\t"first.height  "\t" second.get_id()"\t" second.get_name() 
  122.        }  
  123.    
  124.        return 0;  
  125. }  

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Die nicht patchbare Sicherheitslücke im Yubico-Zwei-Faktor-Authentifizierungsschlüssel beeinträchtigt die Sicherheit der meisten Yubikey 5-, Security Key- und YubiHSM 2FA-Geräte Die nicht patchbare Sicherheitslücke im Yubico-Zwei-Faktor-Authentifizierungsschlüssel beeinträchtigt die Sicherheit der meisten Yubikey 5-, Security Key- und YubiHSM 2FA-Geräte Sep 04, 2024 pm 06:32 PM

Eine nicht patchbare Schwachstelle im Yubico-Zwei-Faktor-Authentifizierungsschlüssel hat die Sicherheit der meisten Yubikey 5-, Security Key- und YubiHSM 2FA-Geräte beeinträchtigt. Die Feitian A22 JavaCard und andere Geräte, die TPMs der Infineon SLB96xx-Serie verwenden, sind ebenfalls anfällig.Alle

Wie implementiert man einen benutzerdefinierten Komparator in C++ STL? Wie implementiert man einen benutzerdefinierten Komparator in C++ STL? Jun 05, 2024 am 11:50 AM

Die Implementierung eines benutzerdefinierten Komparators kann durch die Erstellung einer Klasse erreicht werden, die „operator()“ überlädt, zwei Parameter akzeptiert und das Ergebnis des Vergleichs anzeigt. Beispielsweise sortiert die StringLengthComparator-Klasse Zeichenfolgen, indem sie ihre Längen vergleicht: Erstellen Sie eine Klasse, überladen Sie „operator()“ und geben Sie einen booleschen Wert zurück, der das Vergleichsergebnis angibt. Verwendung benutzerdefinierter Komparatoren zum Sortieren in Containeralgorithmen. Mit benutzerdefinierten Komparatoren können wir Daten anhand benutzerdefinierter Kriterien sortieren oder vergleichen, selbst wenn wir benutzerdefinierte Vergleichskriterien verwenden müssen.

So sortieren Sie WPS-Ergebnisse So sortieren Sie WPS-Ergebnisse Mar 20, 2024 am 11:28 AM

Bei unserer Arbeit verwenden wir häufig WPS-Software. Es gibt viele Möglichkeiten, Daten in WPS-Software zu verarbeiten, und die Funktionen sind auch sehr leistungsfähig. Wir verwenden häufig Funktionen, um Durchschnittswerte, Zusammenfassungen usw. zu ermitteln Methoden, die für statistische Daten verwendet werden können, wurden für alle in der WPS-Softwarebibliothek vorbereitet. Nachfolgend stellen wir die Schritte zum Sortieren der Ergebnisse in WPS vor. Nachdem Sie dies gelesen haben, können Sie aus der Erfahrung lernen. 1. Öffnen Sie zunächst die Tabelle, die eingestuft werden soll. Wie nachfolgend dargestellt. 2. Geben Sie dann die Formel =rank(B2, B2: B5, 0) ein und achten Sie darauf, 0 einzugeben. Wie nachfolgend dargestellt. 3. Drücken Sie nach Eingabe der Formel die Taste F4 auf der Computertastatur. In diesem Schritt wird der relative Bezug in einen absoluten Bezug umgewandelt.

So sortieren Sie in Excel So sortieren Sie in Excel Mar 05, 2024 pm 04:12 PM

Sortiermethoden in Excel: 1. Einzelspaltensortierung; 2. Mehrfachspaltensortierung; 3. Benutzerdefinierte Sortierung. Detaillierte Einführung: 1. Die einspaltige Sortierung ist die gebräuchlichste Sortiermethode. Sie sortiert nach einer ausgewählten Spalte. 2. Die mehrspaltige Sortierung bezieht sich auf das Sortieren von Daten in mehreren Spalten, normalerweise zuerst nach einer bestimmten Spalte von, Sortieren nach einer anderen Spalte; 3. Benutzerdefinierte Sortierung, die es Benutzern ermöglicht, die Sortierreihenfolge entsprechend ihren eigenen Bedürfnissen zu definieren.

So sortieren Sie WPS-Tabellen, um die Datenstatistik zu erleichtern So sortieren Sie WPS-Tabellen, um die Datenstatistik zu erleichtern Mar 20, 2024 pm 04:31 PM

WPS ist eine sehr umfassende Bürosoftware, einschließlich Textbearbeitung, Datentabellen, PPT-Präsentationen, PDF-Formaten, Flussdiagrammen und anderen Funktionen. Unter ihnen sind die Texte, Tabellen und Demonstrationen, die wir am häufigsten verwenden, und sie sind auch diejenigen, mit denen wir am besten vertraut sind. Bei unserer Studienarbeit verwenden wir manchmal WPS-Tabellen, um einige Datenstatistiken zu erstellen. Wenn wir beispielsweise die Ergebnisse so vieler Schüler manuell sortieren müssen, wird das wirklich ein Problem sein Tatsächlich müssen wir uns keine Sorgen machen, denn unsere WPS-Tabelle verfügt über eine Sortierfunktion, die dieses Problem für uns löst. Als nächstes lernen wir, wie man WPS zusammenordnet. Methodenschritte: Schritt 1: Zuerst müssen wir die WPS-Tabelle öffnen, die sortiert werden soll

So ordnen Sie mehrere Spalten in Power Query per Drag & Drop neu an So ordnen Sie mehrere Spalten in Power Query per Drag & Drop neu an Mar 14, 2024 am 10:55 AM

In diesem Artikel zeigen wir Ihnen, wie Sie mehrere Spalten in PowerQuery per Drag & Drop neu anordnen. Beim Importieren von Daten aus verschiedenen Quellen kann es vorkommen, dass die Spalten nicht in der gewünschten Reihenfolge vorliegen. Durch die Neuordnung von Spalten können Sie diese nicht nur in einer logischen Reihenfolge anordnen, die Ihren Analyse- oder Berichtsanforderungen entspricht, sondern verbessert auch die Lesbarkeit Ihrer Daten und beschleunigt Aufgaben wie Filtern, Sortieren und Durchführen von Berechnungen. Wie ordne ich mehrere Spalten in Excel neu an? Es gibt viele Möglichkeiten, Spalten in Excel neu anzuordnen. Sie können einfach die Spaltenüberschrift auswählen und an die gewünschte Stelle ziehen. Dieser Ansatz kann jedoch umständlich werden, wenn es um große Tabellen mit vielen Spalten geht. Um Spalten effizienter neu anzuordnen, können Sie den erweiterten Abfrageeditor verwenden. Erweiterung der Abfrage

Optimieren Sie die Leistung der Go-Sprachkarte Optimieren Sie die Leistung der Go-Sprachkarte Mar 23, 2024 pm 12:06 PM

Optimieren der Leistung der Go-Sprachkarte In der Go-Sprache ist Karte eine sehr häufig verwendete Datenstruktur, die zum Speichern einer Sammlung von Schlüssel-Wert-Paaren verwendet wird. Allerdings kann die Kartenleistung bei der Verarbeitung großer Datenmengen beeinträchtigt werden. Um die Leistung der Karte zu verbessern, können wir einige Optimierungsmaßnahmen ergreifen, um die zeitliche Komplexität von Kartenoperationen zu reduzieren und dadurch die Ausführungseffizienz des Programms zu verbessern. 1. Kartenkapazität vorab zuweisen. Beim Erstellen einer Karte können wir die Anzahl der Kartenerweiterungen reduzieren und die Programmleistung verbessern, indem wir Kapazität vorab zuweisen. Im Allgemeinen wir

Erweiterte Sortierung von PHP-Arrays: benutzerdefinierte Komparatoren und anonyme Funktionen Erweiterte Sortierung von PHP-Arrays: benutzerdefinierte Komparatoren und anonyme Funktionen Apr 27, 2024 am 11:09 AM

In PHP gibt es zwei Möglichkeiten, ein Array in einer benutzerdefinierten Reihenfolge zu sortieren: Benutzerdefinierter Komparator: Implementieren Sie die Comparable-Schnittstelle und geben Sie die Vergleichsregeln der beiden Objekte an. Anonyme Funktion: Erstellen Sie eine anonyme Funktion als benutzerdefinierten Komparator, um zwei Objekte anhand eines Kriteriums zu vergleichen.

See all articles