2017-09-05 4 views
0

セットは、キータイプのオブジェクトを格納するソート済みの関連コンテナです。 Setはシンプルアソシエーティブコンテナです。つまり、キーの種類として という値型がKeyであることを意味します。また、ユニークなアソシエイティブ コンテナです。つまり、2つの要素は同じではありません。C++でキーのセットとして<int, int>を使用できませんSTL

私は数とそれがkeyなどの文字列に表示された位置でset<pair<int, int>>を構築しようとしていました。 setのキーとしてpair<int, int>を挿入しようとするとpairがユニークだったが、ペアの最初の要素が再び現れたときに

、挿入が成功しているされませんでした。

#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); 
} 

そして、出力されました:

9 0 
8 1 
7 2 
3 3 

最初の要素が重複していたとして不足しているエントリ8 4で。

答えて

0

理由は非常に簡単でした。

compareメソッドは、最初の要素が既に 'set'に存在していた場合の対処方法を知っていました。この問題を解決してこの問題を解決しました。ここ

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; 
     } 
    } 
}; 

pairの最初の素子は、第1比較され、最初の要素だけを比較したときに1以前とは対照的に等価の場合、第2の要素がチェックされます。

greater<pair<int, int>>()

または less<pair<int,int>>()

としてCMP機能:

+6

ええ、そうすることができます。または、単に 'std :: greater >' – StoryTeller

+0

@StoryTellerを使用してください。そうですね、それはきれいな方法です。私はこれを加えました。なぜなら、誰かが自分自身の 'compare'メソッドを書き留めてしまったからです。 – thebenman

+0

あるいは、 'T == std :: pair 'であっても、 'lhs> rhs; – juanchopanza

0

あなたはファンクタを使用することができます。 そして#include<functional>

+0

' less 'は既に' std :: set 'のデフォルトです。 – MSalters

関連する問題