2012-08-20 3 views
1

У меня возникла проблема с использованием функции стирания на C++.C++: использование стирания в векторе итераторов

I имеет следующую структуру:

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<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> > > > 

в

__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> > > > 

Есть ли способ исправить это? Я попытался с помощью итератора вместо того, чтобы const_iterator, но это просто переместил ошибку компиляции в

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

Разъяснения: Я знаю, что функция стирания ожидает неконстантный итератор. Я ищу способ создания этого неконстантного итератора без изменения объявления родителя и детей в классе TreeElement.

ответ

3

Parent is const итератор, поэтому parent->second - это const, поэтому parent->second.children - const, поэтому parent->second.children.begin() возвращается const итератор.

erase ожидает инертный не-const.

+0

И есть ли способ создать неконстантный итератор без изменения объявления родителя? – user1611565

+0

@ пользователь1611565 nope. Вы могли бы, конечно, отбросить 'const', но это очень уродливо. Почему вы все равно хотите использовать const_interator, в коде нет ничего, что бы запретить использовать обычный итератор. –

+0

В настоящее время я добавляю методы к существующей системе, в этом случае метод удаления. Я не должен менять класс TreeElement. – user1611565

0

Вы не можете сделать erase() при использовании const_iterator. Цель const_iterator - запретить модификацию vector любым способом, включая стирание через нее элементов. Вы должны использовать просто iterator, а затем исправить эту ошибку компиляции.

Тогда эта ошибка компиляции связана с тем, что вы пытаетесь присвоить const_iterator неконстантным iterator. Если вы измените и сделаете parent неконстантным iterator, ошибка должна исчезнуть.

Смежные вопросы