繁体   English   中英

如何在类中使用重载的const_iterator?

[英]How can I use a overloaded const_iterator inside a class?

我正在用C ++做一个大学项目,目的是学习如何使用不同的STL容器及其迭代器。

在我的程序中,我有一个带有集合的类:

class ConjuntoDeLetras{
    private:
        set<Letra> letras;

    public:
        ConjuntoDeLetras();   
        ···
};

在类内部,我有两个嵌套类,迭代器和const_iterator。 (我不知道这是否是制作班级迭代器的最佳方法,但老师告诉我们,我们需要以此方式进行操作):

class iterator{
    private:
        set<Letra>::iterator it;
    public:
        iterator();

        Letra operator*();

        ConjuntoDeLetras::iterator& operator++();

        ConjuntoDeLetras::iterator& operator+=(int num);

        bool operator==(const ConjuntoDeLetras::iterator &i);

        bool operator!=(const ConjuntoDeLetras::iterator &i);

        friend class ConjuntoDeLetras;
};

class const_iterator{
    private:
        set<Letra>::const_iterator it;
    public:
        const_iterator();

        Letra operator*();

        ConjuntoDeLetras::const_iterator& operator++();

        ConjuntoDeLetras::const_iterator& operator+=(int num);

        bool operator==(const ConjuntoDeLetras::const_iterator &i);

        bool operator!=(const ConjuntoDeLetras::const_iterator &i);

        friend class ConjuntoDeLetras;
};

两种迭代器类方法都可以正常工作。 ConjuntoDeLetras类中,我们具有begin和end方法:

ConjuntoDeLetras::iterator begin();
ConjuntoDeLetras::const_iterator begin() const;
ConjuntoDeLetras::iterator end();
ConjuntoDeLetras::const_iterator end() const;

问题在这里。 当我要使用const_iterator时,我们遇到了问题:

ConjuntoDeLetras::const_iterator itL;

for(itL=L.begin(); itL!=L.end(); ++itL){
    CantidadLetras aux;
    aux.frecuenciaAbsoluta = 0;
    aux.frecuenciaRelativa = 0;
    aux.letra = (*itL).getLetra();

    salida.push_back(aux);
}

当我执行此代码时,编译器会说我没有const_iterator到迭代器的operator= 我知道问题的原因,这是因为对象L不是const变量,并且使用普通的迭代器begin()end() 我考虑过删除函数的最终const,但是我不能仅使用返回类型来重载该函数。 我不知道什么是最好的解决方案。 这是编译器错误:

error: no match for ‘operator=’ (operand types are ‘ConjuntoDeLetras::const_iterator’ and ‘ConjuntoDeLetras::iterator’)
 for(itL=L.begin(); itL!=L.end(); ++itL){
                 ^

end()相同的错误。

您缺少其他++运算符和必需的typedef才能成为迭代器。

另外,您需要=default复制/移动/分配。

最后,您需要一个从iteratorconst_iterator的转换构造iterator

可选地,添加两个const_iterator::operator=(iterator)重载(复制分配和移动分配),再加上const_iterator::operator==(iterator const&)iterator==const_iterator类似。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM