你能帮我处理我的 const_iterator 内部类吗?

Posted

技术标签:

【中文标题】你能帮我处理我的 const_iterator 内部类吗?【英文标题】:Can you help me with my const_iterator inner class? 【发布时间】:2018-10-07 15:23:37 【问题描述】:

我正在尝试更多地了解 C++ 中的迭代器,因此我构建了一个包含指向 int 的向量的类持有者。然后我建立了一个内部迭代器子类,一切都很顺利。然后我想我应该建立一个 const_iterator 子类,作为新手,我无法弄清楚如何让所有 const 东西在我的新子类中工作。

class Holder

public:
    Holder(list<int> _mylist = list<int>()) : mylist(_mylist) 
    class iterator;
    iterator begin()  return iter.begin(*this); 
    class iterator
    
    public:
        iterator() ;
        iterator begin(Holder &h) 
            lit = h.mylist.begin();
            return *this;
        
        int operator*()  return *lit; 
        iterator& operator++()  ++lit; return *this; 
    private:
        list<int>::iterator lit;
    ;

    class const_iterator;
    const_iterator begin() const  return citer.begin(*this); 
    class const_iterator
    
    public:
        const_iterator() ;
        const_iterator begin(const Holder &h) const 
            lit = h.mylist.begin();
            return *this;
        
        int operator*()  return *lit; 
        const_iterator& operator++()  ++lit; return *this; 
    private:
        list<int>::const_iterator lit;
    ;
private:
    list<int> mylist;
    iterator iter;
    const_iterator citer;
;

特别是在第 28 行“lit = h.mylist.begin()”我收到错误“没有运算符 '=' 匹配这些操作数”我知道我只是不了解魔术const,但有些情况需要 const_iterators,我不知道如何解决。任何能让我摆脱迷雾的帮助将不胜感激。

【问题讨论】:

不,一切都没有“顺利”。显示的代码存在许多基本问题。我认为你试图走得太快。放慢脚步,专注于 C++ 基础知识,并学习如何正确使用 C++ 库中现有容器中的现有迭代器。一旦你真正理解了它们是如何工作的,你应该能够自己实现它们,但这根本上是错误的。例如,没有理由让一个容器为了某些不清楚的目的而拥有一个迭代器的某个实例。标准 C++ 容器都没有。 感谢@SamVarshavchik 的评论。我一直在探索迭代器,我最初写了一个,其中构造函数需要对外部类的引用,它在我身上爆发了。所以,我决定采取另一种策略。我的最终目的是编写我自己的 unordered_map(关联数组)实现,其中我有一个向量和一个列表来迭代。我希望能够编写一个可以同时包含向量迭代器和列表迭代器的迭代器。 确实,迭代器通常必须对其容器具有某种内部引用,但对于任何人的构造函数来说,这既不是这里也不是那里。迭代器由其容器的begin() 和end()(也许还有find() 和其他一些)创建。因此,这些方法可以完成构建适当迭代器的新实例所需的一切。将迭代器的一些实例存储为类本身的一部分,并不能真正完成任何有用的事情,只会增加不必要的混乱。 再次感谢@SamVarshavchik 的评论。我将尝试更多地考虑不存储这些迭代器的私有实例。乍一看,这似乎可以解决我的问题。 不太清楚为什么在发布后一分钟内就收到了反对票。 【参考方案1】:

采纳@SamVarshavchik 和@zett42 的建议,我做了一些似乎对我有用的更改。

class Holder

public:
    Holder(list<int> _mylist = list<int>()) : mylist(_mylist) 
    class iterator;
    iterator begin() 
     
        iterator iter;
        iter.lit = mylist.begin();
        return iter;
    
    class iterator
    
    public:
        iterator() ;
        int operator*()  return *lit; 
        iterator& operator++()  ++lit; return *this; 
        friend class Holder;
    private:
        list<int>::iterator lit;
    ;

    class const_iterator;
    const_iterator begin() const
    
        const_iterator citer;
        citer.lit = mylist.begin();
        return citer;
    
    class const_iterator
    
    public:
        const_iterator() ;
        const_iterator(iterator it) : lit(it.lit)  
        int operator*() const  return *lit; 
        const_iterator& operator++()  ++lit; return *this; 
        friend class Holder;
    private:
        list<int>::const_iterator lit;
    ;

private:
    list<int> mylist;
;

int main()

    list<int> intList =  1,2,3,4 ;
    const Holder chold(intList);
    auto cit = chold.begin();
    cout << *++cit << endl;
    Holder hold(intList);
    auto ait = hold.begin();
    Holder::const_iterator it = hold.begin()
    ++it;
    cout << *++it << endl;

不再相关 - 我仍然不确定为什么我能够声明 const_iterator begin() const,但将其定义为 const_iterator begin() 没有 const 关键字。但我希望这个答案能对其他人有所帮助。

【讨论】:

一点建议:删除iterator::begin() 成员函数。迭代器拥有begin() 成员是非常不寻常和令人困惑的。通常只有容器有 begin()end() 成员。而是从Holder::begin() 分配lit 成员。将Holder 设为iteratorconst_iterator 的好友,这样它就可以访问私人lit 成员。 另外Holder::const_iterator 需要一个带有Holder::iterator 参数的转换构造函数。否则以下将无法编译:Holder h; Holder::const_iterator it = h.begin();

以上是关于你能帮我处理我的 const_iterator 内部类吗?的主要内容,如果未能解决你的问题,请参考以下文章

大家好,你能帮我解决一个问题,当从 json 删除、添加或更新数据时,我的 recyclerview 应该自动更新

你能帮我解析这个 JSON 吗?

你能帮我解决keras的尺寸问题吗?

我想在mysql中拆分结果你能帮我吗?

你能帮我解决 Unity3d 项目中数组或枚举中的错误吗?

试图告诉 TypeScript 忽略 node_modules,但它不起作用。你能帮我吗?