2017-09-05 3 views
0

Set ist ein sortierter assoziativer Container, der Objekte vom Typ Key speichert. Set ist ein einfacher assoziativer Container, was bedeutet, dass sein Werttyp, wie sowie sein Schlüsseltyp, Key ist. Es ist auch ein eindeutiger assoziativer Container, was bedeutet, dass keine zwei Elemente gleich sind.Das Paar <int, int> kann nicht als Schlüssel in C++ verwendet werden. STL

Ich habe versucht, ein set<pair<int, int>> mit der Anzahl und der Lage zu bauen, wo es in der Zeichenfolge als key erscheint.

Beim Versuch, einen pair<int, int> als Schlüssel für set einzufügen, war die Einfügung nicht erfolgreich, wenn das erste Element des Paares erneut angezeigt wurde, obwohl pair eindeutig war.

#include <iostream> 
#include <set> 
#include <iterator> 

using namespace std; 
struct compare 
{ 
    bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs) 
    { 
     return lhs.first > rhs.first; 
    } 
}; 
void print(set<pair<int, int>, compare> myset) 
{ 
    for(auto iter=myset.begin(); iter!=myset.end();++iter){ 
     cout << iter->first << ' ' << iter->second << endl; 
    } 
} 

void BuildSet(int num) 
{ 
    set<pair<int, int>, compare> values; 
    string number = to_string(num); 
    for(int i=0; i<number.size(); ++i) 
    { 
     int quot = number[i]-'0'; 
     values.insert(make_pair(quot, i)); 
    } 
    cout << endl; 
    print(values); 
    cout << endl; 
} 
int main() { 
    BuildSet(98738); 
} 

Und der Ausgang war:

9 0 
8 1 
7 2 
3 3 

Mit dem Eintritt 8 4 als erstes Element fehlte dupliziert werden.

Antwort

0

Der Grund war sehr einfach.

Die Methode compare wusste, wie man damit umgeht, falls das erste Element bereits im 'Set' vorhanden war. Das Ändern dieses Problems löste dieses Problem.

struct compare 
{ 
    bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs) 
    { 
     if(lhs.first != rhs.first) 
     { 
      return lhs.first > rhs.first; 
     } 
     else 
     { 
      return lhs.second > rhs.second; 
     } 
    } 
}; 

Hier wird das erste Element des pair ersten verglichen und bei Gleichheit wird das zweite Element geprüft, der einen früheren Gegensatz, wenn nur das erste Element verglichen.

+6

Ja, könnten Sie das tun. Oder benutze einfach 'std :: large >' – StoryTeller

+0

@StoryTeller Ja, das wäre der saubere Weg, es zu tun. Ich fügte das hinzu, falls irgendein Körper sich verfangen hatte, um seine eigene "Compare" -Methode zu schreiben. – thebenman

+0

Oder nur 'lhs> rhs;' – juanchopanza

0

könnten Sie Funktors verwenden:

greater<pair<int, int>>()

oder less<pair<int,int>>()

als cmp Funktion. Und #include<functional>

+0

'weniger ' ist bereits die Standardeinstellung für 'std :: set ', auch wenn 'T == std :: pair '. – MSalters

Verwandte Themen