2011-05-03 5 views
2

집합을 사용하여 개체를 보관하고 있습니다. 세트의 첫 번째 오브젝트를 변경하려고합니다. 이것은 내가 뭘하려 :집합에서 개체 자식 멤버를 변경하는 방법

set<myClass>::iterator i = classlist.begin(); 
i->value = 0; 

이 오류가 내가 얻을 수있다 : 변수가 읽기 전용이 되었는가 어떻게

error: read-only variable is not assignable 

? 어떻게 변경 될 수 있습니까?

+0

'classlist '가 무엇인지 알려주십시오. – quamrana

+0

classlist는 myClass 객체가 포함 된 집합입니다. –

+0

잘못되었습니다. 죄송합니다. 'myClass'는 무엇입니까? 좀 더 구체적으로 말하면 연산자 quamrana

답변

1

집합의 내용은 효과적으로 읽기 전용이므로 집합의 구성원 값을 원래대로 변경할 수는 없습니다. 당신이 할 수있는 일은 그것을 제거하고 필요한 새로운 가치를 가진 새로운 멤버를 추가하는 것입니다. 이 제한은 std :: set의 2 진 트리 구현 때문에 필요합니다.

#include <set> 

struct myClass{ 
    int value; 
    int comp; 
}; 

bool operator<(const myClass& lhs,const myClass& rhs){ 
    return lhs.comp<rhs.comp; 
} 

int main(){ 

    std::set<myClass> classlist; 
    myClass c; 
    classlist.insert(c); 

    std::set<myClass>::iterator i=classlist.begin(); 
    i->value=0; 

    return 0; 
} 

을하지만 우연의 일치하여이 유일한 작품 :

+0

읽기 전용이 아닌 세트와 유사한 다른 컨테이너가 있습니까? –

+0

예, 마찬가지로지도의 키를 변경할 수 없습니다. –

+0

그래서 set과 비슷한 컨테이너가 읽기 전용이 아닙니까? –

0

이 VS2008에서 컴파일합니다. operator<comp 회원들을 비교하며 value 회원을 변경합니다. 당신이 정말로 set의 요소를 수정해야하는 경우

+0

이것은 GCC 하에서 컴파일되지 않습니다 **. –

1

는 요소는 한 번 set에서 삭제하고 set에 다시 삽입되어야합니다. 예를 들어
: myClassvalue 멤버를 참조하지 않는 operator< 경우

set<myClass>::iterator i = classlist.begin(); 
myClass c = *i; 
c.value = 0; 
classlist.erase(i); 
classlist.insert(c); 

, 당신은 std::map 대신 set 사용할 수 있습니다. value 회원 이하지 않는 새로운 myClass되어 있다고 가정하고, value 회원의 종류가 T라고 가정하면, 는 std::map< newMyClass, T >는 목적을 만날 것입니다.

+0

지도에서 키를 변경할 수 없습니다. –

+0

@unapersson : 의견을 보내 주셔서 감사합니다.그러나, 나는 대답의 코멘트와 많은 관련성을 볼 수 없다. 미안. 위의 대답은'map'에서 키의 수정에 대해 언급하지 않았습니다. –

0

Microsoft에서 STL을 업데이트했을 때 Visual Studio 2010에서 모든 반복기를 일정하게 만들었습니다. 따라서 set :: iterator와 set :: const_iterator는 동일합니다.

이유는 집합에서 키가 데이터 자체이고 데이터를 변경할 때 키가 아니기 때문입니다. http://blogs.msdn.com/b/vcblog/archive/2009/05/25/stl-breaking-changes-in-visual-studio-2010-beta-1.aspx

당신이 당신의 데이터를 수정해야 할, 그리고 제거하고 삽입되고 싶지 않은 경우 , 그럼 대신지도를 사용

은 Microsoft C++ 팀

여기이 차단 변화에보고했다.

관련 문제