2011-09-04 5 views
2

정수 집합을 정수 집합으로 매핑해야합니다.정수 집합 사이의 매핑

먼저, 모든 가능한 정수 집합이 고려되지는 않습니다. 대신, 응용 프로그램이 (사용하는) 관련 세트를 프로그래밍 방식으로, 한 번만 만들고 이진 파일로 직렬화합니다.

다음으로는 QMap<QSet<int>, QSet<int> > setMap을 작성합니다.

나중에 응용 프로그램이 다른 정수 집합을 구성하고 (사용자 입력에 따라) userSet이라고하고 setMap[userSet]이됩니다.

이제는 QMap에 키 유형에 대해 operator <이 정의되어 있어야하며, 분명히 QSet<int>에는 키가 없습니다.

어떻게해야합니까?

+0

몇 세트가 있습니까? 무차별 한 조사가 질문에서 벗어나는 것입니까? –

답변

1

세트가 정적 인 경우 테이블 (QVector<QSet<int> >)에로드하고 해당 테이블의 세트 색인을 세트 자체 대신 키 및 값 (QMap<int,int>)으로 사용하십시오.

+0

이것은 가장 우아한 해결책 인 것 같습니다. 감사합니다! – vedran

0

나는 세트를 정렬 된리스트로 변환하고 매핑 한 다음 (세트로 다시 변환한다). 순서가 지정된 목록의 비교 연산자는 집합보다 쉽게 ​​정의 할 수 있습니다. 물론, 이것은 당신을 위해 너무 느릴 수 있습니다.

해시 맵을 사용할 수도 있습니다.

+0

해시지도도 제 생각이었습니다. 그러나 qHash()는 QSet 에 대해 구현되지 않았습니다. – vedran

+0

직접 구현할 수 있습니다. –

1

오버로드 된 < 연산자를 제공해야합니다. QMap documentation에서 Employee 클래스 예제를 참조 할 수 있습니다. 귀하의 경우에는, 당신은 다음과 같은 기능을 제공해야합니다

bool operator<(const QSet<int> &first, const QSet<int> &second) 
{ 
    // your logic to compare the two sets 
} 
+0

두 세트를 비교하는 논리가 문제라고 생각합니다. –

+0

QSet은 균형 잡힌 검색 트리를 사용하고 STL 세트를 반복하여 오름차순으로 값을 제공하는 STL 세트와 달리 해시 테이블 기반 구현을 사용합니다. 따라서 STL 세트를 사용하면 비교하기가 더 쉽습니다. 당신은 단순히 STL지도로 전환하고 설정할 수 있습니다 ... STL 세트가 정렬 된 컨테이너이기 때문에 STL 세트를 비교하는 것이 더 간단합니다. STL 세트를 반복하면 항목이 오름차순으로 반환됩니다. 하지만 QSet에서는 이것이 가능하지 않다고 생각합니다. –

+0

이 작업을 수행 할 수 있습니다. set1의 각 항목에 대해 필요한 매핑 된 값이 set2에 있는지 또는 이와 비슷한지 확인합니다. –

1

당신은 항상하고지도를 QString의 키를 만들기의 가능성을 가지고있다. 세트에서 숫자를 주문하고, 어떻게 든 인쇄하고 (임의의 분리 기호로) 행복하게하십시오.

+0

시도해 보았지만 작동하지만 고통스럽게 느립니다. 어쨌든 유용한 아이디어! 감사! – vedran

관련 문제