2010-07-26 5 views
5

이것은 이전 질문에 대한 후속 조치입니다 (Complexity of STL max_element).STL 세트에서 최대 요소 지우기

기본적으로 최대 요소를 세트에서 팝하고 싶지만 문제가 있습니다.

set<Object> objectSet; 

Object pop_max_element() { 
    Object obj = *objectSet.rbegin(); 
    set<Object>::iterator i = objectSet.end()--; //this seems terrible 
    objectSet.erase(i); //*** glibc detected *** free(): invalid pointer 
    return obj; 
} 

이전에 내가 objectSet.erase(objectSet.rbegin()); 시도했지만 컴파일러가 일치하는 기능을 (필자는 reverse_iterator를 좋아하지 않는다 그것을 추측하고있어)가 없다고 불평 : 여기

대략 내 코드입니다. 빈 세트를 확인하지는 않지만 objectSet.size() >> 0 일 때 실패합니다.

+0

'* objectSet.rbegin();'은 오타입니까? 너 세트를 역 참조하는거야? –

+1

아니요, 참조 해제되는 iterator입니다. 이 점은 별보다 더 강하게 묶입니다. –

답변

9

당신은 꽤 가깝지만 반복기 할당에 너무 많은 노력을하고 있습니다. 후속 감소 연산자를 end이 반환하는 것에 적용하고 있습니다. 그게 무슨 일인지는 모르겠지만, 네가 원하는 것은 거의 틀림 없다. end의 결과를 i에 할당하고 을 입력 한 다음을 감소시켜 세트의 마지막 요소를 가져옵니다.

set<Object>::iterator i = objectSet.end(); 
--i; 
Object obj = *i; 
objectSet.erase(i); 
return obj; 
5

는이 작업을 수행해야합니다

set<Object> objectSet; 

Object pop_max_element() { 
    Object obj = *objectSet.rbegin(); 
    set<Object>::iterator i = --objectSet.end(); // NOTE: Predecrement; not postdecrement. 
    objectSet.erase(i); //*** glibc detected *** free(): invalid pointer 
    return obj; 
} 
5

set<Object>::iterator i = objectSet.end()--; 

수단 '할당 종료() 난 후 버려야하는 것입니다 임시 변수를 감소에' . 즉, set<Object>::iterator i = objectSet.end();과 같으며, 끝에서 하나를 가리키기 때문에 end()를 지울 수 없다는 것을 알고있을 것입니다. 대신이 같은 것을 사용

assert(!objectSet.empty()); // check there is something before end 
set<Object>::iterator i = objectSet.end(); 
--i; 
objectSet.erase(i); 

을하고 괜찮아, 그것은 본질적으로 세트 .back()을 재현 할 수있는 합법적 인 방법입니다.

또한 역방향 반복기는 base() 구성원을 가지고있어 정상적인 반복기로 변환 할 수 있으며 일반 반복기 만 지울 수 있습니다. objectSet.erase(objectSet.rbegin().base())을 사용해보십시오.

+0

rbegin(). base()를 사용해 보았습니다. – sas4740

+3

'rbegin(). base()'는'end()'와 동일합니다. –

관련 문제