2017-10-26 25 views
0

맵을 사용하여 구성원 입력 벡터를 기반으로 오브젝트 쌍을 계산하려고합니다. 이 목적을 위해 더 나은 데이터 구조가 있다면 알려주십시오. 내 프로그램에서 int 벡터 목록을 반환합니다. 각 int 벡터는 두 int 벡터 (한 쌍의 int 벡터) 사이의 비교 결과입니다. 그러나 두 개의 int 벡터가 같을지라도 (아마도 다른 순서로) 비교 결과는 다를 수 있습니다. 각각의 int 벡터 쌍이 생성 한 몇 개의 다른 출력 (int 벡터)을 저장하고 싶습니다.C++ 오브젝트 쌍에 대한 맵 비교 자

내가 .inp()

두 쌍의 (a1,b1)(a2,b2)이 동일한 것으로 간주되어야한다 (a1.inp() == a2.inp() && b2.inp() == b1.inp()) 또는 (a1.inp() == b2.inp() and b1.inp() == a2.inp()) 내 객체의 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; 

그래서 문제는 내가지도 비교와 이쌍 동등성을 정의 할 수있는 방법이다. 나는 한 쌍의 두 벡터를 연결하려고 시도했지만, 이는 내가 원하는 것이 아닌 (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

내가 입력 벡터의 쌍을 계산하기 위해지도를 사용하고 싶습니다. 이 목적을 위해 더 나은 데이터 구조가 있다면 알려주십시오. std::unordered_map를 사용

대신 인해 2 이유로 고려 될 수있다 :

  • 해시가 제대로 구현 경우가있을 수보다 빠른 경우에만 해시를 구현해야 std::map

  • operator== 대신 operator< , operator==은이 경우에 간단합니다.

std::vector의 해시 구현 방법은 here입니다. 귀하의 경우 가능한 솔루션은 두 벡터를 하나에 합치고 정렬 한 다음 그 방법을 사용하여 해시를 계산하는 것입니다. 이것은 간단한 솔루션이지만 많은 해시 충돌을 발생시켜 성능을 저하시킬 수 있습니다. 더 나은 대안을 제시하려면 사용 된 데이터에 대한 지식이 필요합니다. 내가 알고있는 것처럼

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를 주문하십시오.