2016-05-31 16 views
4

私はペアのセットを注文する必要があります(1つはint、2つ目はcharです)。私はこのように注文しなければなりません。 12 G、11 F、10 A、10 B、10 C最初は降順、2番目は昇順) が最初に表示されます。これは私がこれまで試したものです、と私は若干の誤差が出る:私が得るC++で2つの順序付け基準(ペアのセット)を使用して順序付きセットを作成する方法は?

#include <iostream> 
#include <fstream> 
#include <algorithm> 
#include <utility> 
#include <set> 

using namespace std; 
set <pair <int,char> > s; 

bool myfunction(const pair<int, char>& i, const pair<int, char>& j) { 
    if(i.first < j.first) return false; 
    if(j.first < i.first) return true; 
    return j.second < i.second; 
} 

void writes() 
{ set <pair<int,char> >::iterator it; 
    for (it = s.begin();it<= s.end();it++) /// line (18) 
     cout<<(*it).second<<" "<<(*it).first<<"\n\n"; 
} 
int main() 
{ ifstream f("info.in"); 
    int n; 
    f>>n; 
    for (int i=1;i<=n;i++) 
    { pair<int,char> x; 
     int st; 
     char nd; 
     f>>st; 
     f>>nd; 
     x.first=st; 
     x.second=nd; 
     s.insert(x); 
    } 
    writes(); 
} 

最初のエラーは、ライン(18)である:「演算子< =」の一致(オペランドの型は「STDません::

5 
10 B 
10 A 
10 C 
11 F 
12 G 

@Sam Varshavchik、エラーで私の問題を解決しましたありがとう!:設定> :: .....

あなたの助けを大幅に

私の入力ファイルは次のようになり感謝しています。 しかし、まだ、私は必要な出力が得られません。 私は唯一得る:

10 A 
10 B 
10 C 
11 F 
12 G 

ペアで注文基準を変更することは可能ですか?そうでない場合は、代わりに何をお勧めしますか?

注文基準のmyfunctionはプログラムによってまだ無視されているようです。どのように私は私のペアの中にそれをオーバーロード?それはちょうどそこに座って、決して使用されていないように見えます。 Using custom std::set comparator それはまだ

using namespace std; 

struct lex_compare { 
    bool operator()(const pair<int, char>& i, const pair<int, char>& j) 
{ 
    if(i.first != j.first) 
    { 
     return (i.first > j.first); 
    } 

    return (j.second > i.second); 
} 
} // forgot ";", after adding it, it works perfectly. 
set <pair <int,char>, lex_compare > s; ///line (22) 

void writes() 
{ set <pair<int,char> >::iterator it; 
    for (it = s.begin();it!= s.end();it++) /// line (18) 
     cout<<(*it).second<<" "<<(*it).first<<"\n\n"; 
} 
int main() 
{ ifstream f("info.in"); 
    int n; 
    f>>n; 
    for (int i=1;i<=n;i++) 
    { pair<int,char> x; 
     int st; 
     char nd; 
     f>>st; 
     f>>nd; 
     x.first=st; 
     x.second=nd; 
     s.insert(x); 
    } 
    writes(); 
} 

ERROR働いていない:ライン(22):このプログラムは私もこの試みたにかかわらず、仕事

それをしない「S」の前に無効宣言子を。

+0

'、//それを追加した後、完全に動作します。'単純な誤植に基づいて投票を終了します。 –

答えて

2
for (it = s.begin();it<= s.end();it++) 

反復子は、一般に、より小さい/より大きいタイプの比較を実装しません。反復子は、一般的に、==!=の比較のみを実装し、同等性をテストします。これは、次のようになります。コンパイル:

for (it = s.begin();it != s.end();it++) 

(のみのランダムアクセスイテレータを安全に比較は<>演算子を使用することができ、かつstd::setのイテレータがランダムアクセスイテレータではありません)

これは、あなたが提起質問に答えますエラー。この質問はあなたのカスタムセット比較関数とは関係ありません。これは別の質問であろう。

0

in descending order by first, and in ascending order by second

に基づいて、比較関数は、する必要があります:

bool myfunction(const pair<int, char>& i, const pair<int, char>& j) 
{ 
    if(i.first != j.first) 
    { 
     return (i.first > j.first); 
    } 

    return (j.second < i.second); 
} 

そして、setで作業するときにそれを使用してください。代わりに、あなたのプログラムに、さらにいくつかの変更が必要になります

set <pair <int,char> > s; 

使用

set <pair <int,char>, mycompare > s; 

を使用します。

  1. を宣言する必要があります。sを定義してください。
  2. イテレータのタイプも変更する必要があります。コンパイラは、あなたがサポートするC++ 11を使用している場合もautoを使用することができ、

    set <pair<int,char>, mycompare >::iterator it; 
    

    :あなたは

    にする必要があり
    set <pair<int,char> >::iterator it; 
    

    を持っています。

    void writes() 
    { 
        auto it = s.begin(); 
        for (; it != s.end(); it++) 
        { 
         cout<<(*it).second<<" "<<(*it).first<<"\n\n"; 
        } 
    } 
    
+0

注文基準のmyfunctionはプログラムによってまだ無視されているようです。どのように私は私のペアの中にそれをオーバーロード?それはちょうどそこにあり、決して使用されていないように見えます。プログラムはそれに関係なく仕事をします – meiznub

0

あなたはmyfunctionを呼び出していないか、それで何かを決して!

struct comparepair { 
    bool operator()(const pair<int, char>& i, const pair<int, char>& j) { 
     if(i.first < j.first) return false; 
     if(j.first < i.first) return true; 
     return i.second < j.second; 
    } 
}; 

次にために

set <pair <int,char>, comparepair > s; 
0

のように、コンパレータとして、それを後からセットを宣言します、あなたのセットを注文し、それを使用し、このように、ファンクタにmyfunctionをオンにする

カスタムコンパレータを使用する場合は、上でリンクしたSO質問に記述されているように関数/ファンクタについてコンテナに伝える必要があります。

あなたの場合の実際の例です。

#include <iostream> 
#include <set> 

typedef std::pair<int, char> pic_t; 


struct comp { 
    bool operator() (const pic_t& p1, const pic_t& p2) const { 
     return (p1.first != p2.first) ? (p1.first > p2.first) : (p1.second < p2.second); 
     // identical, slightly better performance: 
     // return (p1.first > p2.first) || (! (p2.first > p1.first) && (p1.second < p2.second)); 
    } 
}; 


int main() 
{ 
    std::set<pic_t, comp> s = { { 10, 'b' }, { 10, 'a' }, { 10, 'c' }, { 11, 'f' }, { 12, 'g' } }; 

    for (auto p : s) 
     std::cout << p.first << ", " << p.second << std::endl; 

    return 1; 
}