C++ STL 다중컨테이너사용 질문드립니다.
2012.03.25 20:00
C++의 STL중 SET을 이용하여 2차원 배열 비슷한걸 만들어야 할 필요가 있습니다.
직접 구현하자니 코드가 너무 커지네요..
다음의 구조를 표현할 수 있어야 합니다.
(빨콩으로 그린거라 양해를..ㅠㅠ)
각 화살표에 연결된 것은 '집합'입니다.
그리고 각 칸은 일종의 배열입니다.
그런데 '모든 집합은 중복되어서는 안됩니다' 만약 {a, b}가 어디선가 나왔다면, 다른데서는 {a, b}가 나오면 안됩니다.
이 때문에 set을 쓰려고 합니다.
그런데 set을 1차원적으로만 써서 어떻게 써야할지 모르겠습니다.
혹 std::set <int, int> itemsets; 이런 식으로 선언하면, 2차원 배열처럼 쓸 수 있나요?
위와 같이 선언은 되는데 쓰는법을 모르겠습니다..
지금은 std::set<std::set<int>> itemsets; 식으로 구현해서 쓰고 있는데, 당연하겠지만 전체원소에 대한 중복체크가 안됩니다.
전체원소에 대한 중복체크 코드를 만들다가 빡세서 질문을 올리는거구요 ㅠㅠ
혹시 방법이 있을까요?
코멘트 5
-
꼬소
03.25 20:29
-
클라우드나인
03.26 08:56
제가 Map을 몰라서요ㅠ map도 이번기회에 알아둬야겠네요.. 감사합니다. ^^
-
set의 <A,B> 사용법은 paring입니다. 원하시는 방식의 동작은 아닙니다.
질문한 내용을 그렇게 단순하게 구현하기는 어렵고, 전체를 빠르게 체크하시려면 hash를 이용하시면 쉽게 될 거 같습니다.
단 std stl에는 hash가 없고, stlport 등에는 있습니다. stlport의 hash는 red-black-tree 알고리즘을 사용하기 때문에 많으면 많을 수록 이론적으로 선형이 됩니다.
정확히 문제의 조건을 모르겠지만 지금 질문내용이고 std stl을 이용하려면 이 문제는 간단하게 질문의 자료구조를 유지하는 set과 전체 집합을 유지하는 set 2개 사용하고 삽입시 비교를 위한 compare function을 사용하면서 동작하는 wrapper를 작성해도 해결될거 같습니다.
-
위에 wrapper얘기했는데, 그렇게 구현하면 2logN, 데이터풀만 hash를 직접 짜서 쓰면 logN + M 이 가능할 거 같습니다.
-
클라우드나인
03.26 08:57
말씀해 주신 방법으로 구현해 봐야겠습니다.. 감사합니다. ^^
증복 체크만 안하고 그냥 자료구조만 보면 map이네요..;;
C++을 안 써서 잘 모르겠어요;;
아마 잘 하시는분이 불쑥 나타나셔서 해결 해 주실거라고 봐욤;;