我正在用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);
}
当我执行此代码时,编译器会说我没有operator=
用于const_iterator到迭代器。我知道问题的原因,这是因为对象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()
相同的错误。
答案 0 :(得分:0)
您缺少其他++
运算符和必需的typedef才能成为迭代器。
此外,您需要=default
复制/移动/分配。
最后,您需要从iterator
到const_iterator
的转换构造函数。
(可选)添加两个iterator::operator=(const_iterator)
重载(复制分配和移动分配),以及类似的const_iterator::operator==(iterator const&)
和iterator==const_iterator
。