簡體   English   中英

C ++:在迭代器向量中使用erase

[英]C++: Using erase in a vector of iterators

我在使用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是const迭代器,因此parent->second是const,因此parent->second.children是const,因此parent->second.children.begin()返回const迭代器。

erase需要一個非const迭代器。

使用const_iterator時不能執行erase() const_iterator的目的是禁止以任何方式修改vector ,包括通過它擦除元素。 您應該使用簡單的iterator ,然后修復該編譯錯誤。

然后編譯錯誤是因為您嘗試將const_iterator分配給非const iterator 如果修改並使parent成為非const iterator ,則錯誤應該消失。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM