: 나는 삭제를 호출 할 때 실제로 모든 정보가 삭제되지 않기 때문에 무한 루프에C++ 세트의 버그?
int x=*(s.rbegin());
while(!s.empty()&&0<x)
{
s.erase(x);
x=*(s.rbegin());
}
그것은 실행합니다. 이것은 이상하게 보입니다. * (s.rbegin())가 반드시 있어야하기 때문입니다.
: 나는 삭제를 호출 할 때 실제로 모든 정보가 삭제되지 않기 때문에 무한 루프에C++ 세트의 버그?
int x=*(s.rbegin());
while(!s.empty()&&0<x)
{
s.erase(x);
x=*(s.rbegin());
}
그것은 실행합니다. 이것은 이상하게 보입니다. * (s.rbegin())가 반드시 있어야하기 때문입니다.
당신은 예를 들어 .. 당신은 당신이 얻을 싶어 요소를 삭제, 작업 x=*(s.rbegin());
int x=*(s.rbegin());
while(!s.empty() && 0<x)
{
s.erase(x);
if(!s.empty())
x=*(s.rbegin());
}
"set *의 끝을 확인하십시오"* - 루프 안의'rbegin() '뿐만 아니라 루프에 들어가기 전에 첫 번째'rbegin()'에 적용됩니다. –
순서 변경하기 전에 세트의 끝을 확인해야합니다
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());
대신이 시도처럼 전통적으로 사용되는 반복이 보인다 긍정적 인 세트에서. 당신이 할 수있는,
s.erase(s.upper_bound(0),s.end());
upper_bound
가 0보다 큰 보장하는 당신에게 끝이 하나의 모든 요소 이후 첫 번째 숫자 0보다 큰에 대한 반복자를 제공합니다 : 이것은이 하나의 선으로 훨씬 더 간단 할 수 있습니다 그들을 모두 지우십시오.
std :: remove_if는 작동하지 않습니다. std :: set을 사용하면 읽기 전용 위치 오류가 할당됩니다. (STL의 비정상적인 구현으로 인해) vc6을 알고있는 마지막 컴파일러 – Swift
@Swift 덕분에이 부분을 제 위치에서 제거했습니다. 대답. –
당신이 모든 요소를 삭제하려고하는 것 같다
for (auto it=s.rbegin(); it!=s.rend(); ++it)
{
}
x의 값은 무엇입니까? –
집합의 마지막 값을 지운 후에 정의되지 않은 동작이 발생하고이 집합에서 이터레이터를 참조 해제합니다. 세트가 비우기 전에'0
어떻게's'을 선언 했습니까? –