如何在 class 中使用重载的 const_iterator?
How can I use a overloaded const_iterator inside a class?
我正在用 C++ 做一个大学项目,其目的是学习如何使用不同的 STL 容器及其迭代器。
在我的程序中,我有一个 class 和一个集合:
class ConjuntoDeLetras{
private:
set<Letra> letras;
public:
ConjuntoDeLetras();
···
};
在 class 内部,我有两个嵌套的 class、迭代器和 const_iterator。 (我不知道这样制作class迭代器是不是最好的方法,但是老师告诉我们需要这样做):
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;
};
两种迭代器class 方法都运行良好。在 ConjuntoDeLetras
class 中,我们有 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=
for const_iterator to iterator。我知道问题的原因,因为对象 L
不是 const 变量并且使用普通迭代器 begin()
和 end()
。我考虑过删除函数的最终常量,但我不能仅使用 return 类型重载函数。我不知道什么是最好的解决方案。这是编译器错误:
error: no match for ‘operator=’ (operand types are ‘ConjuntoDeLetras::const_iterator’ and ‘ConjuntoDeLetras::iterator’)
for(itL=L.begin(); itL!=L.end(); ++itL){
^
和end()
一样的错误。
您缺少另一个 ++
运算符和成为迭代器所需的类型定义。
此外,您需要 =default
copy/move/assignments.
最后,您需要一个从 iterator
到 const_iterator
的转换构造函数。
可选地添加两个 const_iterator::operator=(iterator)
重载(复制分配和移动分配),加上 const_iterator::operator==(iterator const&)
和 iterator==const_iterator
类似。
我正在用 C++ 做一个大学项目,其目的是学习如何使用不同的 STL 容器及其迭代器。
在我的程序中,我有一个 class 和一个集合:
class ConjuntoDeLetras{
private:
set<Letra> letras;
public:
ConjuntoDeLetras();
···
};
在 class 内部,我有两个嵌套的 class、迭代器和 const_iterator。 (我不知道这样制作class迭代器是不是最好的方法,但是老师告诉我们需要这样做):
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;
};
两种迭代器class 方法都运行良好。在 ConjuntoDeLetras
class 中,我们有 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=
for const_iterator to iterator。我知道问题的原因,因为对象 L
不是 const 变量并且使用普通迭代器 begin()
和 end()
。我考虑过删除函数的最终常量,但我不能仅使用 return 类型重载函数。我不知道什么是最好的解决方案。这是编译器错误:
error: no match for ‘operator=’ (operand types are ‘ConjuntoDeLetras::const_iterator’ and ‘ConjuntoDeLetras::iterator’)
for(itL=L.begin(); itL!=L.end(); ++itL){
^
和end()
一样的错误。
您缺少另一个 ++
运算符和成为迭代器所需的类型定义。
此外,您需要 =default
copy/move/assignments.
最后,您需要一个从 iterator
到 const_iterator
的转换构造函数。
可选地添加两个 const_iterator::operator=(iterator)
重载(复制分配和移动分配),加上 const_iterator::operator==(iterator const&)
和 iterator==const_iterator
类似。