2017-01-28 8 views
0
내가 코드의이 부분 시도

: 나는 삭제를 호출 할 때 실제로 모든 정보가 삭제되지 않기 때문에 무한 루프에C++ 세트의 버그?

int x=*(s.rbegin()); 
while(!s.empty()&&0<x) 
{ 
    s.erase(x); 
    x=*(s.rbegin()); 
} 

그것은 실행합니다. 이것은 이상하게 보입니다. * (s.rbegin())가 반드시 있어야하기 때문입니다.

+1

x의 값은 무엇입니까? –

+4

집합의 마지막 값을 지운 후에 정의되지 않은 동작이 발생하고이 집합에서 이터레이터를 참조 해제합니다. 세트가 비우기 전에'0

+0

어떻게's'을 선언 했습니까? –

답변

-1

당신은 예를 들어 .. 당신은 당신이 얻을 싶어 요소를 삭제, 작업 x=*(s.rbegin());

int x=*(s.rbegin()); 
while(!s.empty() && 0<x) 
{ 
    s.erase(x); 
    if(!s.empty()) 
     x=*(s.rbegin()); 
} 
+0

"set *의 끝을 확인하십시오"* - 루프 안의'rbegin() '뿐만 아니라 루프에 들어가기 전에 첫 번째'rbegin()'에 적용됩니다. –

0

순서 변경하기 전에 세트의 끝을 확인해야합니다

std::set<int> s; 

int x; 
s.insert(5); 
s.insert(15); 
s.insert(25); 
s.insert(0); 
s.insert(20); 
while(!s.empty()&& (0<(x=*s.rbegin()))) 
{ 
    std::cout<< x << "\n"; 
    s.erase(x); 
} 

이 방법으로 그주의 너는 정의했다. 위 코드의 출력은

25 
20 
15 
5 

입니다. while() 루프를 정의한 방식으로 0 요소를 찾으면 중지 할 예정입니다. 종료 후 0이 남았고 세트는 비어 있지 않습니다.

if (!s.empty()) 
{ 
    int x = *(s.rbegin()); 
    while (0 < x) 
    { 
     s.erase(x); 
     if (s.empty()) break; 
     x = *(s.rbegin()); 
    } 
} 

을 또는 값 대신 사용하는 반복자를 삭제하려고 :

std::set<int>::reverse_iterator iter = s.rbegin(); 
while ((iter != s.rend()) && ((0 < *iter)) 
    s.erase((iter++).base()); 
0

대신이 시도처럼 전통적으로 사용되는 반복이 보인다 긍정적 인 세트에서. 당신이 할 수있는,

s.erase(s.upper_bound(0),s.end()); 

upper_bound가 0보다 큰 보장하는 당신에게 끝이 하나의 모든 요소 이후 첫 번째 숫자 0보다 큰에 대한 반복자를 제공합니다 : 이것은이 하나의 선으로 훨씬 더 간단 할 수 있습니다 그들을 모두 지우십시오.

+0

std :: remove_if는 작동하지 않습니다. std :: set을 사용하면 읽기 전용 위치 오류가 할당됩니다. (STL의 비정상적인 구현으로 인해) vc6을 알고있는 마지막 컴파일러 – Swift

+0

@Swift 덕분에이 부분을 제 위치에서 제거했습니다. 대답. –

0

당신이 모든 요소를 ​​삭제하려고하는 것 같다

for (auto it=s.rbegin(); it!=s.rend(); ++it) 
{ 
}