【问题标题】:Nested iterator class, begin() and end() sentinel issues嵌套迭代器类,begin() 和 end() 标记问题
【发布时间】:2014-01-24 20:20:28
【问题描述】:

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

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

【问题讨论】:

  • 这是一种练习吗,或者您可以直接使用std::setstd::unordered_set 代替吗?
  • end() 表示 1 过去的结束而不是实际结束。已经有很多讨论了,请参考stackoverflow.com/questions/9963401/…
  • @H2CO3 这是一个任务

标签: c++ class templates vector iterator


【解决方案1】:

首先,您应该提供简短、独立、正确的示例 (SSCCE)。

下面的程序假设我正确假设了一些功能,您将如何解决您面临的问题:

#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;
}

【讨论】:

  • 非常感谢您的帮助!在你给我这段代码之后它就起作用了,虽然我不太明白你添加了什么来修复它。你能解释一下你添加了什么吗?
【解决方案2】:

结束迭代器指向“过去的结束”位置。您不应该尝试取消引用它。

此外,您可能不想打印intset.begin()(它是迭代器,即指针),而是打印*(intset.begin()),它是(指向)元素。

【讨论】:

  • 我照你说的做了,但还是给了我同样的输出 (00)
猜你喜欢
  • 2020-10-14
  • 2016-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多