我在使用C ++中的擦除功能时遇到问题。
我有以下结构:
typedef std::map<std::string,TreeElement> ObjMap;
class TreeElement {
public:
ObjMap::const_iterator parent;
std::vector<ObjMap::const_iterator > children;
}
现在我正在尝试使用erase函数从其父级子级列表中删除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();
澄清: 我知道erase函数需要一个非const迭代器。我正在寻找一种方法来创建这个非const迭代器,而无需更改TreeElement类中 parent 和 children 的声明。
答案 0 :(得分:3)
Parent是const迭代器,因此parent->second
是const,因此parent->second.children
是const,因此parent->second.children.begin()
返回const迭代器。
erase
需要一个非const迭代器。
答案 1 :(得分:0)
使用erase()
时,您无法const_iterator
。 const_iterator
的目的是禁止以任何方式修改vector
,包括通过它删除元素。您应该只使用iterator
,然后修复该编译错误。
然后编译错误是因为您尝试将const_iterator
分配给非const iterator
。如果您修改parent
非常量iterator
,则错误应该消失。