【问题标题】:How can I use const_iterator correctly?如何正确使用 const_iterator?
【发布时间】:2015-12-08 10:56:03
【问题描述】:

我正在尝试使用来自 stl lib 的地图创建一个容器类,但我对 const_iterator 有严重问题。

在我的课堂ConjuntoPreguntas 中,您如何欣赏,我尝试使用与begin()end() 方法不同的格式,但我没有找到正确的方法。

在我的主课中,我尝试使用接收const ConjuntoPreguntasimprimir 函数,但出现了问题。所以我需要使用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&lt;const int,Pregunta&gt;&amp;,否则它是……嗯,不是常量。
  • 好的,当我使用“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


【解决方案1】:

你的 cbegin 和 cend 应该是 const:

const_iterator cbegin() const {
//                      ^^^^^
    const_iterator i ; 
    i.it = preguntas.begin();
    return i ;
}

const_iterator cend() const {
//                    ^^^^^
    const_iterator i;
    i.it= preguntas.end();
    return i;
}

也就是说,您可以直接从地图中导入它们,而不是定义迭代器和 const_iterator:

class ConjuntoPreguntas {
private:
    map<int,Pregunta> preguntas;

public:
    using const_iterator = map<int,Pregunta>::const_iterator;
    using iterator = map<int,Pregunta>::iterator;

【讨论】:

  • 谢谢,我试过用 const 和不用 const 编译,但是错误编译器是一样的:error: no match for ‘operator=’
  • 如果我不使用write const编译,我的类可以完美编译,但是主类中的imprimir函数有错误,如果我尝试使用const编译,我的类不会编译。
猜你喜欢
  • 2019-11-05
  • 2013-02-20
  • 2013-09-30
  • 2013-03-17
  • 2019-05-29
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
相关资源
最近更新 更多