- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 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=
for const_iterator to 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()
也有同样的错误。
最佳答案
您缺少其他 ++
运算符和成为迭代器所需的 typedef。
另外,您需要=default
copy/move/assignments。
最后,您需要一个从 iterator
到 const_iterator
的转换构造函数。
可选择添加两个 const_iterator::operator=(iterator)
重载(复制赋值和移动赋值),加上 const_iterator::operator==(iterator const&)
和 iterator==const_iterator
同理。
关于c++ - 如何在类中使用重载的 const_iterator?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54014963/
我是一名优秀的程序员,十分优秀!