2009-05-20 1 views

답변

7

실제 의도가 무엇인지 추측 할 수 있으므로 키와 값을 모두 포함하는 클래스가 이미 있다고 가정합니다. 이 경우 std :: set을 사용자 지정 비교로 설정하면 std :: map보다 더 나은 선택이 될 수 있습니다.

그런 다음 클래스의 키 부분 만 비교할 비교를 제공해야하며 키 부분은 개체가 집합 내에있는 한 const (시간이 경과해도 변경되지 않음) 여야합니다. 주석에서 언급했듯이 집합의 요소는 const로만 액세스 할 수 있으므로 이러한 요소의 값을 변경하려면 쓰기 액세스를 const_cast하거나 구성원을 변경 가능으로 선언해야합니다.

또 다른 대답은 입니다. iain은 또 다른 좋은 제안입니다. 드물게 컨테이너에 삽입하고 대부분 요소를 검색하는 컨테이너에 액세스하면 정렬 된 std :: vector 및 std :: binary_search가 집합에 대한 매우 효과적인 대안입니다.

+1

주된 문제점은 주문을 유지하기 위해 set이 상수 값을 보유하므로 CustomPair가 두 번째 멤버를 변경할 수 있어야하고 첫 번째 멤버 만 사용하도록 비교해야합니다. –

+0

@Greg Rogers 고마워, 답변에 핵심 부분의 constness를 추가했습니다. – lothar

+0

OP 의도가 무엇인지 모르겠다. 그의 질문은 <...> 대신 std :: allocator에 CustomPair <...>을 템플릿 매개 변수로 전달하는 것이었다. 이것은 질문에 대답하지 않습니다. – Ari

3

나는 std :: set을 사용할 확률이 더 높습니다.

-2

나는 std::allocator의 사용이 rebind<std::pair>을 통해 이루어 지므로 CustomPair을 무시하므로 원하는 효과를 얻지 못할 것이라고 생각합니다. 실제로, 당신이 거기에 놓은 타입이 무엇이든 상관 없다. STL 함수는 그것을 무시할 것이다. 적어도 그들 중 일부는 확실히 이것을 할 것이지만, 나는 모든 것이 확실하지는 않습니다. 엄밀히 말하면 이것은 거의 확실하게 구현에 달려 있습니다. 나는 표준이 말하는 것을 모른다.

+1

@Ari 할당자는 STL 컨테이너의 내부 구현을 변경할 수 없으며 컨테이너 내부 데이터의 메모리가 할당되는 위치와 방법 만 변경할 수 있습니다. – lothar

+0

사실, 제 대답은 당신이 OP가 말한 것을 할 수 있다고 말합니다.하지만 당신은 원하는 효과를 얻지 못할 것입니다. 나는 또한 이것이 가능하다는 것을 설명하기 위해 계속했다 (컴파일은 괜찮지 만, 당신이 생각하는 것을하지는 않는다). 뭐가 문제 야. – Ari

3

"효과적인 STL"23 장 "정렬 된 벡터로 연관 컨테이너 교체"에서 설명한대로 lothar에서 설명한대로 세트를 사용하거나 정렬 된 std::vector을 사용합니다.

맞춤형 비교기를 사용하여 정렬 된 벡터의 std::binary_search은지도 검색보다 속도가 빠르며 때로는 빠르기 때문에 반복 속도가 훨씬 빠릅니다. 삽입 작업은 더 비싸지 만 (각 삽입 후에 정렬을 호출해야 함) 많은지도 유스 케이스가 매우 드물게 삽입됩니다.

벡터는 세트보다 융통성이 있습니다.

이 접근법으로 2000 개의 복잡한 객체 (int로 색인화 됨)의 맵을 대체했으며, 맵의 모든 객체는 서버 클래스 시스템에서 50 초에서 5 초 미만으로 처리되었습니다. 지도 조회 시간에 눈에 띄는 차이는 없었습니다.

+0

std :: vector에서 이진 검색을 위해 +1 – lothar

+1

std :: binary_search()는 지정된 값이 존재하는지 여부를 반환합니다. std :: equal_range()를 의미 했습니까? – bk1e

+0

감사합니다. 맞습니다. equal_range입니다. – iain

관련 문제