2016-04-23 13 views
-1

Dieser Code anders verhält, wenn ich eine Bedingung hinzu:Einfügen Paar in std :: gesetzt ist inkonsistent (nicht erkennt <pair> .second)

Erster Fall:

#include<bits/stdc++.h> 
using namespace std; 

struct comp 
{ 
    bool operator()(pair<int,pair<int,int> > a, pair<int,pair<int,int> > b) 
    { 
     return a.first>b.first; 
    } 
}; 

int main() 
{ 
    set<pair<int,pair<int,int>>,comp> s; 
    auto d = s.insert({4,{6,10}}); 
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl; 
    d = s.insert({4,{0,4}}); 
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl; 
} 

Ausgabe

4 6 10 
4 6 10 

Zweiter Fall: (mit condit Ion auf .second)

#include<bits/stdc++.h> 
using namespace std; 

struct comp 
{ 
    bool operator()(pair<int,pair<int,int> > a, pair<int,pair<int,int> > b) 
    { 
     if(a.first==b.first) 
      return a.second.first<b.second.first; 
     return a.first>b.first; 
    } 
}; 

int main() 
{ 
    set<pair<int,pair<int,int>>,comp> s; 
    auto d = s.insert({4,{6,10}}); 
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl; 
    d = s.insert({4,{0,4}}); 
    cout<<(d.first)->first<<" "<<(d.first)->second.first<<" "<<(d.first)->second.second<<endl; 
} 

Ausgang:

4 6 10 
4 0 4 

Warum fügt sich das Gerät nicht ein anderes Paar im ersten Fall? Ich dachte, die Extra-Bedingung entscheidet nur über die Reihenfolge und unterscheidet nicht zwischen den Elementen.

+3

Weil du falsch gedacht hast? – juanchopanza

+0

@juanchopanza;) – goelakash

+0

Bitte sagen Sie: Wer hat Ihnen gesagt, dass Sie diesen Header hinzufügen? Wir müssen die Menschen davor warnen, von dieser Quelle Ratschläge zu erhalten. –

Antwort

3

Ihr erster Vergleicher berücksichtigt nur den ersten Punkt des Paares. Wenn Sie versuchen, das zweite Paar einzufügen, wird es als gleich dem bereits eingefügten Paar betrachtet und daher nicht eingefügt.

Stattdessen erhalten Sie das Objekt zurück, das bereits in das Set eingefügt wurde. Dies ist das erwartete Verhalten.

Denken Sie daran, dass ein Set definitionsgemäß nur eine Instanz eines bestimmten Objekts enthält, und Ihr Vergleicher hilft Ihnen beim Festlegen, wie sich 2 Objekte miteinander vergleichen.

+0

Hinweis: Ohne Verwendung eines benutzerdefinierten Komparators kann das 'std :: set' zwischen (a, (b, c)) und (a, (d, e)) unterscheiden. – goelakash