2012-09-25 2 views
0

composite_key 인 인덱스가있는 multi_index_container가 있습니다. 그러나 키로 요소를 지울 수있는 방법을 찾을 수 없습니다. 아래를 참조하십시오 :composite_key가있는 multi_index_container에서 키 당 요소 지우기

#include <boost/multi_index_container.hpp> 
#include <boost/multi_index/member.hpp> 
#include <boost/multi_index/hashed_index.hpp> 
#include <boost/multi_index/composite_key.hpp> 

using namespace boost::multi_index; 

struct Point 
{ 
    int x, y; 
}; 

void func() 
{ 
    multi_index_container<Point,indexed_by< 
    hashed_unique< 
     composite_key<Point, 
        member<Point,int,&Point::x>, 
        member<Point,int,&Point::y> > 
     > > > points; 

    points.find(boost::make_tuple(3, 3)); // <- works 
    points.erase(boost::make_tuple(3, 3)); // <- failes to compile 
} 

삭제 (키) 복합없는 인덱스 작동합니다. 하지만 복합 키에 대한 올바른 구문을 찾을 수 없습니다.

답변

2

erase는 튜플 (. 기술적으로,이 중 compatible extensions 개념 관련)과 상호 운용을 허용 과부하의 유형이없는하지만 당신은 좀 더 코드와 같은 효과를 가질 수 있습니다

auto p=points.equal_range(boost::make_tuple(3,3)); 
points.erase(p.first,p.second); 
+0

좋아 확장되지 않습니다,하지만이 서명 '을 위해 무엇인지 궁금 해서요이다 size_type 지우기 (key_param_type x)'. 전처리 된 코드에서 찾았습니다. composite_key로 호출 할 방법이 없습니까? –

+0

또 하나 : erase (iterator, iterator)는 반복자를 반환합니다. 해시 인덱스로 오랜 시간이 걸릴 수 있습니까? 나는 여전히 어떻게 든 가능하다면 지우기 (키)를 호출하는 것을 선호 할 것이다. –

+0

지우기가 호환 가능한 키를 처리하기 위해 확장되지 않는 이유는 '템플릿을 지우는 (it)'코드를 호출 할 때 '템플릿 iterator erase (const CK & ck)'가 기존의 iterator erase (iterator) '반복자가 아닌'반복자'로 변환 가능한 객체를 가지고 있습니다. 조금 병적 인, 나는 인정한다. –

0

귀하의 요청에 따라 이전 답변에 추가하십시오. 이처럼이있을 수 있습니다

Point p={3,3}; 
points.erase(points.key_extractor()(p)); 

이 유일한 문제는 (Point가 구성하는 비용이있는 경우.)이

관련 문제