マップを使用して、メンバーの入力ベクトルに基づいてオブジェクトのペアを数えたいと思います。この目的のために優れたデータ構造がある場合は、教えてください。 私のプログラムは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位となるように並べ替えます。それでは、通常の字句比較よりも劣っているのです。 –
これはXYの問題かもしれませんが、この比較が必要な理由を詳しく説明できますか?「入力ベクトルのペアを数える」にはどのように役立ちますか?あなたは本当に何をしようとしていますか? –