2014-08-28 4 views
0

다음과 같은 오류 메시지가 나타납니다. "표현식은 수정 가능 값이어야합니다. iter-> first = iter-> second;" 코드의 경우 :쌍 세트의 반복자는 const입니까?

func(const std::set<Edge> &obstructEdges1, 
     const std::set<Edge> &obstructEdges2) 
{ 
std::set<Edge> obstructEdges = obstructEdges1; 
obstructEdges.insert(obstructEdges2.begin(), obstructEdges2.end()); 

for (std::set<Edge>::iterator iter = obstructEdges.begin(); 
    iter != obstructEdges.end(); iter++) 
{ 
    if (iter->first > iter->second) 
    { 
    int t = iter->first; 
    iter->first = iter->second; 
    iter->second = t; 
    } 
... 

Edge은 int 쌍입니다. 뭐가 문제 야? 어떤 이유로 iter->first 모양이 const으로 간주됩니다.

+0

@ juanchopanza 나는 비 const 하나에 const 세트를 복사했습니다. –

+1

유사 (AndreyT의 답변 이후 발견) : http://stackoverflow.com/questions/4064841/strange-error-setintbegin-always-returning-const-iterator –

답변

4

예, std::set 반복자 세트 자체 std::set::iterator 즉, const없고 std::set::const_iterator 모두 상수 반복자이다 (동일한 형태를 참조 할) 경우에도 항상 CONST 반복기이다. std::set은 연관 컨테이너입니다. 표준 연관 컨테이너에서는 저장된 키를 제 위치에서 수정할 수 없습니다. 즉, std::set에서 아무 것도 수정할 수 없습니다. 물론 비교기는 전체 집합 요소를 키로 처리 할 필요는 없지만 std::set 관점에서 전체가 핵심이므로 불변입니다.

는 연관 컨테이너 23.2.4

6 이터레이터 양방향 반복자 범주 인 것이 말했듯. 값 유형이 이고 키 유형과 동일한 연관 컨테이너의 경우 iterator 및 const_iterator는 모두 상수 이터레이터입니다. iterator와 const_iterator가 같은 유형인지 여부는 지정되지 않습니다.

+0

와우, 내가 열쇠를 변경하려고한다는 것을 몰랐습니다. .. –

4

set<T>::iteratorset<T>::const_iterator처럼 항상 * 상수 반복자입니다, 그래서 당신은 세트의 모든 요소를 ​​수정하는 데 사용할 수 없습니다. 세트의 요소를 직접 수정할 수 있다면, 그 세트는 대부분 순서가 없어져서 Bad Things ™로 이어질 것입니다.

* 글쎄, C++ 11 이후로, 적어도 주요한 구현체는 어쨌든 오래 전에 const-set 반복기를 갖지는 않았 겠지만 적어도.

+0

어제'set :: begin()'이 VS2008에서 비 const iterator를 반환한다는 것을 알았습니다. 하지만 VS2008은 고대입니다 :) –

+0

저는 과거에 비 const'set' 반복자를 사용 했었고 매우 유용했습니다. 객체의 한 부분을 키로 설정합니다.이 부분은 변경 불가능한 상태로 유지되어야하지만 나머지 부분은 자유롭게 수정할 수 있습니다. 그 기능이 사라지는 것을 보니 슬 'm습니다. –