迭代器和同一类中的const_iterator的问题
Problems with an iterator and an const_iterator in the same class
我正在编写一个类"转换器",我需要两个迭代器,一个常量,另一个更正常。这是有趣的代码区域:
...
iterator begin() {
iterator i;
i.puntero=palabras.begin();
return i;
}
iterator end(){
iterator i;
i.puntero=palabras.end();
return i;
}
...
const_iterator begin() const {
const_iterator i;
i.puntero=palabras.begin();
return i;
}
const_iterator end() const {
const_iterator i;
i.puntero=palabras.end();
return i;
}
...
有更多的代码,但我认为这并不有趣。
好吧,我需要在 for 循环中使用迭代器,并且在代码失败的这一刻:
#Work fine
for(Traductor::iterator it=traductor.begin(); it!=traductor.end(); ++it)
cout << it->first << endl;
#Don't work
for (Traductor::const_iterator it=traductor.begin(); it!=traductor.end(); ++it)
cout << it->first << endl;
错误是:
error: conversion from ‘Traductor::iterator’ to non-scalar type ‘Traductor::const_iterator’ requested for (Traductor::const_iterator it=traductor.begin(); it!=traductor.end(); ++it)
而且我不知道程序如何使用第二个循环中的const_iterator,并且不要尝试使用正常
。知道吗?非常感谢。
采用的解决方案:
最后,如果我使用 const traductor
则无需将名称更改为 end
和 begin
方法,但如果traductor
不是常量,我需要使用 cend
和 cbegin
方法。
例:
#When is constant:
const Traductor tradConst = traductor;
for (Traductor::const_iterator it=tradConst.begin((; it!=tradConst.end((; ++it(
#When isn't, use diferent methods to differentiate:
//for (Traductor::const_iterator it=traductor.cbegin(); it!=traductor.cend(); ++it)
...
所以,我有:
const_iterator begin() const {...}
const_iterator end() const {...}
iterator begin() {...}
iterator end(){...}
当我使用常量和非常量对象时很有用,当我想在非常量对象中使用常量和非常量迭代器时,我将更改方法的名称:
const_iterator cbegin() const {...}
const_iterator cend() const {...}
iterator begin() {...}
iterator end(){...}
非常感谢你们!
除非traductor
是const
,否则traductor.begin()
返回一个iterator
。
您必须提供接受iterator
的 const_iterator
构造函数(或在迭代器中添加operator const_iterator
(。
你正在初始化的东西的类型与初始化器中的函数调用如何解决几乎没有关系(阅读:否(。
这意味着,当traductor
非const
时,您的非const
begin()
和end()
将始终被使用!
您可以通过允许iterator
隐式转换为 const_iterator
来解决此问题。还可以选择添加 cbegin()
和 cend()
函数,这些函数明确、始终返回 const_iterator
。在许多情况下,这是"更安全的"。
标准库容器可以同时执行这两项操作。
对象traductor
似乎不是一个常量对象。 因此,在此循环中调用了begin
和end
的非常量重载函数
for (Traductor::const_iterator it=traductor.begin(); it!=traductor.end(); ++it)
cout << it->first << endl;
你可以写
for (Traductor::const_iterator it= const cast<const Traductor &>( traductor ).begin(); it!=const cast<const Traductor &>( traductor ).end(); ++it)
cout << it->first << endl;
另一种方法是定义函数cbegin
和cend
专门用于选择const_iterator
。
- 违反const正确性:我应该现实地期待什么问题
- 关于重载 -> 运算符中 const 关键字的特定位置的问题
- 从const ptr*转换为ptr*时出现问题
- 语法问题:"char [5] const &"是什么意思?
- 使用 const double* const 作为模板参数 - 代码性能问题
- 当对象被其他对象引用时,关于 const 限定符的微妙问题
- char,const char*阵列问题,用于mqtt client.publish
- 汇编问题试图使用qobject_cast进行const指针
- 将 API 函数参数从 'char *' 更改为"const char *"有哪些潜在问题?
- 使用 LLVM 从 const void * 转换为模板类型时出现问题
- const int&performance 问题
- 有关 const decltype(x)& 的问题
- const void*对象初始化问题C++
- 交换与使用std::map[]运算符赋值(const问题)
- 错误 C2280;运算符 =(const Employee &) 在执行 employees.erase() 时出现问题
- 调用接受三个参数的函数出现问题,其中一个是 int const
- 如何解决此问题:从 'const char*' 到"const uint8_t* 的转换无效
- c++按引用传递、值传递和Const问题
- c++类型别名Const问题
- VS2010中的const问题