【发布时间】:2015-12-08 10:56:03
【问题描述】:
我正在尝试使用来自 stl lib 的地图创建一个容器类,但我对 const_iterator 有严重问题。
在我的课堂ConjuntoPreguntas 中,您如何欣赏,我尝试使用与begin() 和end() 方法不同的格式,但我没有找到正确的方法。
在我的主课中,我尝试使用接收const ConjuntoPreguntas 的imprimir 函数,但出现了问题。所以我需要使用const ConjuntoPreguntas&。
void imprimir( const ConjuntoPreguntas& cp ){
ConjuntoPreguntas::const_iterator it= cp.cbegin();
};
int main(){
ConjuntoPreguntas CP;
ifstream fin("PreguntasConstitucion.txt");
fin >> CP;
imprimir(CP);
}
class ConjuntoPreguntas{
private:
map<int,Pregunta> preguntas;
public:
class const_iterator; /
class iterator{
private:
map<int,Pregunta>::const_iterator it;
public:
iterator & operator++(){
++it;
}
iterator & operator--(){
--it;
}
pair<const int,Pregunta> &operator *(){
return *it;
}
bool operator ==(const iterator &i){
return i.it==it;
}
bool operator !=(const iterator &i){
return i.it!=it;
}
friend class ConjuntoPreguntas;
friend class const_iterator;
};
/**
* @brief clase para iterar sobre la guia
**/
class const_iterator{
private:
map<int,Pregunta>::iterator it;
public:
const_iterator & operator++(){
++it;
}
const_iterator & operator--(){
--it;
}
const pair<const int,Pregunta> &operator *(){
return *it;
}
bool operator ==(const const_iterator &i){
return i.it==it;
}
bool operator !=(const const_iterator &i){
return i.it!=it;
}
friend class ConjuntoPreguntas;
};
/**
* @brief Inicializa un iterator al comienzo de la guia
* */
**iterator begin(){
iterator i;
i.it=preguntas.begin();
return i;
}
const_iterator cbegin()const{
const_iterator i ;
i.it = preguntas.begin();
return i ;
}
/**
const_iterator cbegin(){
const_iterator i ;
i.it = preguntas.begin();
return i ;
}
*/
/**
* @brief Inicializa un iterator al final de la guia
* */
iterator end(){
iterator i;
i.it=preguntas.end();
return i;
}
const_iterator cend()const{
const_iterator i;
i.it= preguntas.end();
return i;
}
/* const_iterator cend(){
const_iterator i;
i.it= preguntas.end();
return i;
}
*/**
};
【问题讨论】:
-
问题是什么?
-
不清楚你的问题是什么,你的意图是什么。通常,返回常量迭代器的方法是
const,如const_iterator begin()const{/*...*/}。另外,常量迭代器通常应该返回const pair<const int,Pregunta>&,否则它是……嗯,不是常量。 -
好的,当我使用“const_iterator cbegin() const{ .........}”并尝试编译它时,编译器说我错误:错误:不匹配' operator=' (操作数类型是 'std::map
::iterator {aka std::_Rb_tree_iterator<:pair int pregunta> >}' 和 'std::map ::const_iterator {aka std::_Rb_tree_const_iterator<:pair int pregunta> >}') 在这一行 -> i.it = preguntas.begin(); -
最后我发现了我的错误,我必须使用 class const_iterator{ private: map
::const_iterator it,然后再编写迭代器而不是 const_iterator。我也必须使用 const 来 *it。
标签: c++11 iterator const-iterator