2011-12-13 3 views
20

집합에서 마지막 구성원을 삭제하려면 어떻게해야합니까?std :: set의 최종 구성원 지우기

set<int> setInt; 
setInt.insert(1); 
setInt.insert(4); 
setInt.insert(3); 
setInt.insert(2); 

어떻게 setInt에서 4을 삭제할 수 있습니다 : 예를 들어

? 나는 다음과 같이 시도했다 :

setInt.erase(setInt.rbegin()); 

그러나 나는 오류가 발생했다. 이 많은 (임의의 순서로 세트에 일을 추가하고 다음 상단 요소를 제거)를하고 있다면 그런데

+0

Doh 맞아요. 세트에 임의 액세스 반복기가 없습니다. – AJG85

답변

17
if (!setInt.empty()) { 
    std::set<int>::iterator it = setInt.end(); 
    --it; 
    setInt.erase(it); 
} 

는, 당신은 또한, std::priority_queue에서 살펴 그에 맞는 여부를 볼 수 있었다 당신의 용법. C에서

+0

오, 웁스, 어떤 이유로 '만약'이 'for'루프라고 생각했는데 ... –

30

당신은 당신이 세트가 비어있는 경우 경우를 처리 할 방법을 결정할 수 있습니다

setInt.erase(std::prev(setInt.end())); 

11 ++.

1

마지막 4 개 대신 4 개를 삭제하려면 find 메소드를 사용해야합니다. 유스 케이스에 따라 마지막이 아닐 수도 있습니다.

std::set<int>::iterator it = setInt.find(4); 
if(it != setInt.end()) { 
    setInt.erase(it); 
} 

마지막 요소의 사용을 삭제하려면 :. 내가 있는지 확실하지 않습니다 동안

if (!setInt.empty()) { 
    setInt.erase(--setInt.rbegin().base()); 
    // line above is equal to 
    // setInt.erase(--setInt.end()); 
} 

을 - * 말을(); O.K입니다. 나는 약간의 독서를했다. 그래서 rbegin(). base()는 end()와 같은 결과를 낳습니다. 둘 다 작동해야합니다.

+0

setInt. [rend()] {setInt.erase (std :: prev (setInt.end())) ] (http://www.cplusplus.com/reference/stl/set/rend/)는 setInt.begin() 이전을 가리키는 반복자를 반환하므로 집합의 끝과 아무 관계가 없습니다. – wigy

+0

당신은 내가 쓰려고 의도 한 바로 그분입니다. :-(나는이 문제를 해결한다 – Totonga

+1

당신의 제안은 질문에서 하나와 어떻게 다릅니 까? 우리가 이미 알고있는 것처럼 작동하지 않습니까? – bitmask

0

세트가 비어 있는지 확인하십시오. 그렇지 않으면 마지막 요소를 가져 와서 이터레이터로 설정하고 해당 반복자를 줄이고 마지막 요소를 지 웁니다.

if (!setInt.empty()) 
{ 
    std::set<int>::iterator it = setInt.end(); 
    --it; 
    if(it != setInt.end()) { 
    setInt.erase(it); 
    } 
} 
나는 올바른 유형이 rbegin에 대해 다른 이름을 사용하여 제안 할 것
5

:

setInt.erase(--setInt.end()); 

당신이 setInt이 비어 있지 않은지 확인 가정을!

btw. 이것은 (타입 std::set<int>::iterator의) 일시적으로 변화하는 감소 연산자를 호출 할 수 있기 때문에 효과적입니다. 이 임시는 지우기 기능으로 전달됩니다.

+0

교활함. 클래스 유형이어야하므로 임시 변수를 감소시킬 수 있어야합니다. –

+0

@SteveJessop : 그들은 있습니다 :) – bitmask

관련 문제