2017-10-26 10 views
0

マップを使用して、メンバーの入力ベクトルに基づいてオブジェクトのペアを数えたいと思います。この目的のために優れたデータ構造がある場合は、教えてください。 私のプログラムはintベクトルのリストを返します。各intベクトルは、2つのintベクトル(一対のintベクトル)の比較の出力です。しかし、2つのintベクトルは同じですが(おそらく異なる順序)、比較の出力は異なります。私はintベクトルの各ペアが生成したいくつかの異なる出力(intベクトル)を格納します。とき(a1.inp() == a2.inp() && b2.inp() == b1.inp())または(a1.inp() == b2.inp() and b1.inp() == a2.inp()).inp()C++のオブジェクトペアのマップコンパレータ

二組(a1,b1)(a2,b2)は、等しいと見なされるべきで、私は私のオブジェクトのint型ベクトルにアクセスできると仮定すると

This answerは言う: < BもB <いずれにも該当しないとき、マップAとBの中

キーが定義上等価です。

class SomeClass 
{ 
    vector <int> m_inputs; 
public: 
    //constructor, setter... 
    vector<int> inp() {return m_inputs}; 
} 

typedef pair < SomeClass, SomeClass > InputsPair; 
typedef map < InputsPair, size_t, MyPairComparator > InputsPairCounter; 

そこで問題は、私はマップのコンパレータと、二対の等価を定義することができるか、です。私はペアの2つのベクトルを連結しようとしましたが、それは(010,1) == (01,01)につながります。これは私が望むものではありません。

struct MyPairComparator 
{ 
    bool operator() (const InputsPair & pair1, const InputsPair pair2) const 
    { 
     vector<int> itrc1 = pair1.first->inp(); 
     vector<int> itrc2 = pair1.second->inp(); 
     vector<int> itrc3 = pair2.first->inp(); 
     vector<int> itrc4 = pair2.second->inp(); 
     // ? 
     return itrc1 < itrc3; 
    } 
}; 
+1

'演算子<'では、各ペアを、最低位が1位となるように並べ替えます。それでは、通常の字句比較よりも劣っているのです。 –

+1

これはXYの問題かもしれませんが、この比較が必要な理由を詳しく説明できますか?「入力ベクトルのペアを数える」にはどのように役立ちますか?あなたは本当に何をしようとしていますか? –

答えて

1

Iは入力ベクトルのペアをカウントするためにマップを使用します。この目的のために優れたデータ構造がある場合は、教えてください。 std::unordered_mapを使用して

は、代わりに起因する2つの理由に考えることができる。

  • ハッシュが適切に実施されれば、それは可能性が速くよりあなただけのハッシュを実装する必要がstd::map

  • operator==の代わりoperator<operator==はこの場合は自明です

std::vectorのハッシュの実装方法の詳細はhereです。あなたのケースでは、可能なソリューションは、両方のベクトルを1つに結合し、ソートし、そのメソッドを使ってハッシュを計算することです。これは簡単な解決策ですが、多くのハッシュ・コリジョンが発生し、パフォーマンスが低下する可能性があります。より良い選択肢を提案するには、使用されるデータの知識が必要です。

0

私が理解として、あなたが欲しい:

struct MyPairComparator 
{ 
    bool operator() (const InputsPair& lhs, const InputsPair pair2) const 
    { 
     return std::minmax(std::get<0>(lhs), std::get<1>(lhs)) 
      < std::minmax(std::get<0>(rhs), std::get<1>(rhs)); 
    } 
}; 

は、我々は、我々は定期的な比較を使用し、{a, b}a < bようにペアを注文します。