2010-07-05 2 views
6

다음 코드가 있습니다.세트 사용시 VS2010의 remove_if 문제

#include <set> 
#include <algorithm> 

using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
typedef set<long> MySet; 

MySet a; 

for(int i = 0; i < 10; ++i) 
{ 
    a.insert(i); 
} 

MySet::iterator start,end,last; 

start = a.begin(); 
end = a.end(); 

last = remove_if(start,end,bind2nd(less_equal<long>(),5)); 

return 0; 
} 

아래의 VS2005는 잘 컴파일하는 데 사용됩니다. '_Next': 당신이 CONST C 인 변수에 할당 할 수 없습니다 : 1 오류 C3892은

오류 : \ 프로그램 파일 \ 10.0 \ VC의 \로는 마이크로 소프트 비주얼 스튜디오 \ 알고리즘

그러나 나는 다음과 같은 오류가 VS2010를 사용하여

컨테이너를 벡터로 만들면 모든 것이 잘됩니다.

내가 알고있는 표준에서 뭔가가 변경되었다고 추측합니다. 누군가 더 이상 작동하지 않는 이유에 대해 알려주시겠습니까?

답변

6

std::set은 항상 요소를 정렬 된 순서로 유지합니다. std::remove_if은 제거하지 않으려는 요소를 콜렉션 시작 부분으로 이동하려고 시도합니다. 이것은 정렬 된 순서로 요소를 유지하는 set의 불변성에 위배됩니다.

코드가 작동하지 않아야합니다. 오래된 컴파일러는 규칙이 작동하지 않아야한다는 사실을 알리기에 충분할만큼 규칙을 엄격하게 시행하지 않았을 수 있습니다.

+0

당신이 그것에 대해 생각할 때 분명하다고 생각합니다. 저는 vc6에서 vs2005로 드래그 한 vs2010으로 대용량 프로젝트를 변환 해 왔습니다. 그리고 나는 작은 오류가 많이 있습니다. 내 정신 분열증 블록을 제거해 주셔서 감사합니다. 나는 vs2005가 상당히 엄격하다고 생각했다. 나는 vs2010만큼 엄격하지 않다고 생각한다. – Rich

+0

해결 방법이 있습니까? remove_if 대신 사용할 수있는 것이 있습니까? – julienln

+2

@julienln : 원하지 않는 항목없이'std :: remove_copy_if'를 사용하여 새 컨테이너를 만들거나 항목을 개별적으로 검색하고 지울 수 있습니다. –