2012-08-20 2 views
1

C++에서 지우기 기능을 사용하는 데 문제가 있습니다. C++ : 이터레이터 벡터에서 지우기 사용

typedef std::map<std::string,TreeElement> ObjMap; 
class TreeElement { 
    public: 
     ObjMap::const_iterator parent; 
     std::vector<ObjMap::const_iterator > children; 
} 

은 지금은 삭제 기능을 사용하여 부모의 자식 목록에서 TreeElement을 제거하기 위해 노력하고있어 :

나는 다음과 같은 구조를 가지고있다.

//Remove from parent 
SegmentMap::const_iterator parent = segment->second.parent; 
std::vector<SegmentMap::const_iterator >::const_iterator it = parent->second.children.begin(); 
for(;((*it)->first != segment->first) && (it != parent->second.children.end()); it++); 
parent->second.children.erase(it); //Compilation fails 

이이 문제를 해결하기 위해 어떤 방법이 있나요이

__gnu_cxx::__normal_iterator<std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, TreeElement> >*, std::vector<std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, TreeElement> > > > 

__gnu_cxx::__normal_iterator<const std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, TreeElement> >*, std::vector<std::_Rb_tree_const_iterator<std::pair<const std::basic_string<char>, TreeElement> > > > 

을 변환 할 수 없습니다 나타내는 컴파일하는 동안 오류를 준다? 나는 반복기 대신 const_iterator를 사용하여 시도하지만, 이것은 단지

std::vector<SegmentMap::const_iterator >::iterator it = parent->second.children.begin(); 

해명에 컴파일 오류가 이동 : 내가 삭제 기능은 const가 아닌 반복자를 기대 알고있다. TreeElement 클래스에서 부모자식의 선언을 변경하지 않고이 비 const 반복기를 만드는 방법을 찾고 있습니다.

답변

3

부모가 const 반복자이므로 parent->second이 const이므로 parent->second.children이 const이므로 parent->second.children.begin()이 const 반복자를 반환합니다.

erase에는 비 반복 반복자가 필요합니다.

+0

부모 선언을 변경하지 않고 비 const 반복기를 만들 수있는 방법이 있습니까? – user1611565

+0

@ user1611565 당신은 물론'const'를 던져 넣을 수 있습니다. 그러나 그것은 매우 추악합니다. 어쨌든 const_interator를 사용하고 싶다면 코드에 일반적인 반복자를 사용하지 못하게하는 요소는 없습니다. –

+0

저는 현재 기존 시스템에 메소드를 추가하고 있는데,이 경우에는 delete 메소드입니다. TreeElement 클래스를 변경하지 않아도됩니다. – user1611565

0

을 사용하는 경우 erase()을 수행 할 수 없습니다. const_iterator의 목적은 요소를 지우는 것을 포함하여 어떤 식 으로든 vector의 수정을 금지하는 것입니다. 단순히 iterator을 사용하고 해당 컴파일 오류를 수정해야합니다.

const_iterator을 const가 아닌 iterator에 할당하려고했기 때문에 컴파일 오류가 발생했습니다. parent을 수정하지 않고 iterator이 아닌 것으로 수정하면 오류가 사라집니다.