嵌套的迭代器类,begin()和end()哨兵问题 [英] Nested iterator class, begin() and end() sentinel issues

查看:66
本文介绍了嵌套的迭代器类,begin()和end()哨兵问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的嵌套迭代器类有问题. end()前哨返回0,我很迷路!任何帮助,将不胜感激.我希望该程序能够接受任何类型的输入,例如一个int,创建向量,并能够填充数组,直到到达end()前哨,例如键入Q或任何非整数.我删除了几行不必要的代码来缩短它.

I am having issues with my nested iterator class. The end() sentinel is returning 0, and I am very lost! Any help would be appreciated. I want this program to be able to take any type of input, e.g. an int, create the vector, and be able to fill the array until the end() sentinel has been reached, such as typing Q, or any non-integer. I took out a few lines of unnecessary code to shorten it.

template <class T>
class Set
{
    private:
        vector<T> m_element;
        int size;
    public:
        Set() : size(0) {};
        ................
        ................
        ................

        class iterator;
        friend class iterator;
        class iterator
        {
            private:
                int i_index;
                Set& s;
            public:
                iterator(Set& is) :s(is), i_index(0) {}
                iterator(Set& is, bool) : s(is), i_index(s.size) {}
                int operator++()
                {
                    return s.m_element[++i_index];
                }
                (other postfix ++ operator)
                int current() const
                {
                    return s.m_element[i_index];
                }
                ....................
                bool operator!=(const iterator &rv) const
                {
                    return i_index != rv.i_index;
                }
                .............................
                int getI()
                {
                    return i_index;
                }
        };
        iterator begin() { return iterator(*this);}
        iterator end() {return iterator(*this, true);}
};

template <class T>
istream& operator>> (istream &in, Set<T> &element)
{
    T elementin;
    Set<T> is;
    class Set<T>::iterator it = element.begin();
    while(it != element.end())
    {
        in >> elementin;
        element.push(elementin);
    }
    return in;
}

int main()
{
    Set<int> intset;
    Set<int>::iterator it = intset.begin();
    for(int i = 0; i < 5; i++)
    {
        intset.push(i);
        cout << it.getI();
        ++it;
    }

    cout << endl << intset.begin() << intset.end();

    return 0;
}

OUTPUT:
01234
00

推荐答案

应首先提供简短,自包含,正确的示例(SSCCE).

1st of all you should provide Short, Self Contained, Correct Example (SSCCE) .

在下面的程序中,假设我已经正确假设了某些功能,如何解决所面临的问题:

Below program how you could resolve the issue you are facing assuming I have assumed some functions correctly:

#include <iostream>
#include <vector>

using namespace std;


template <class T>
class Set
{
  private:
    vector<T> m_element;
    int size;
  public:
    Set() : size(0) {};
    Set(const Set& rhs)
    {
       m_element = rhs.m_element;
       size = rhs.size;
    }

    void push(T data)
    {

      m_element.push_back(data);
      ++size;
    }

    class iterator;
    friend class iterator;
    class iterator
    {
      private:
        int i_index;
        Set& s;
      public:
        iterator(Set& is) :s(is), i_index(0) {}
        iterator(Set& is, bool) : s(is), i_index(s.size) {}
        iterator(Set& is, bool val,bool last) : s(is), i_index(s.size) {

          cout<<endl<<"size "<<s.size<<endl;
        if(last)
          i_index = s.size -1 ;
        }

        T operator*()
        {
          return s.m_element[i_index];
        }

        int operator++()
        {
          return s.m_element[++i_index];
        }
        int current() const
        {
          return s.m_element[i_index];
        }
        bool operator!=(const iterator &rv) const
        {
          return i_index != rv.i_index;
        }
        int getI()
        {
          return i_index;
        }
    };
    iterator begin() { return iterator(*this);}
//function to check if we have passed last element
        iterator end() {return iterator(*this, true);}
//function to get last element 
        iterator last() {return iterator(*this, true,true);}

};

  template <class T>
istream& operator>> (istream &in, Set<T> &element)
{
  T elementin;
  Set<T> is;
  class Set<T>::iterator it = element.begin();
  while(it != element.end())
  {
    in >> elementin;
    element.push(elementin);
  }
  return in;
}

int main()
{
  Set<int> intset;
  Set<int>::iterator it = intset.begin();
  for(int i = 0; i < 5; i++)
  {
    intset.push(i);
    cout << it.getI();
    ++it;
  }

// cout << endl << intset.begin() << intset.end();
//We use last() to print the last element as end() confirms 
//that we have passed last element and does not point to last element.
  cout << endl << *(intset.begin()) << " " <<*(intset.last())<<endl;

  return 0;
}

这篇关于嵌套的迭代器类,begin()和end()哨兵问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆