我正在写一个类“翻译器”,我需要两个迭代器,一个常量,另一个更正常。 这是有趣的代码区域:
...
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对象中使用const和非const迭代器时,我将更改方法的名称:
const_iterator cbegin() const {...}
const_iterator cend() const {...}
iterator begin() {...}
iterator end(){...}
非常感谢你们!
答案 0 :(得分:3)
除非traductor
为const
,否则traductor.begin()
会返回iterator
。
您必须提供const_iterator
的构造函数,该构造函数需要iterator
(或在迭代器中添加operator const_iterator
)。
答案 1 :(得分:1)
您初始化的东西的类型很少(读取:否),这与初始化程序中的函数调用将如何解决有关。
这意味着,当traductor
为非const
时,您的非const
begin()
和end()
将始终被使用!
您可以通过允许iterator
隐式转换为const_iterator
来解决此问题。还可以选择添加cbegin()
和cend()
函数,这些函数明确地始终返回const_iterator
。 This is "safer" in a number of cases
标准库容器可以同时执行这两种操作。
答案 2 :(得分:0)
似乎对象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
。