【发布时间】:2019-05-29 14:38:39
【问题描述】:
我正在用 C++ 做一个大学项目,其目的是学习如何使用不同的 STL 容器及其迭代器。
在我的程序中,我有一个带有集合的类:
class ConjuntoDeLetras{
private:
set<Letra> letras;
public:
ConjuntoDeLetras();
···
};
在类内部,我有两个嵌套类,iterator 和 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() 也出现同样的错误。
【问题讨论】:
-
比较函数是成员函数,所以它们需要是
const,而不仅仅是接受const参数。例如;bool operator==(const ConjuntoDeLetras::const_iterator &i) const。原因是表达式it1 == it2应将it1和it2视为const。 -
一些相关(但有用)的阅读:Writing your own STL Container
-
谢谢@user4581301 我没有找到这篇文章。这是完美的。谢谢!
标签: c++ iterator const-iterator