null迭代器会导致未定义的行为吗?

时间:2011-03-21 07:43:23

标签: c++ iterator

using namespace std;
class myList
{
  public:
    mylist():_internalList(),_lastPostition(0)
  {
  }
    typedef list<string>::iterator Itr;
    bool enqueue(string);
    Itr next()
    {
      if(_lastPostition == 0)
        _lastPostition = _internalList.begin();
      if(_lastPostition == _internalList.end())
        return (_lastPostition = 0);
      return _lastPostition++;
    }
  private:
    list<string> _internalList;
    Itr _lastPostition;
}

enqueue不是push_back,它是根据某些自定义逻辑插入的。 我无法使用std::set和重载operator <,因为我的插入逻辑不具有传递性 - ( a < b && b < c)并不意味着a < c

这有效,但我不确定它是否是一个未定义的行为。 将0分配给迭代器并检查0是否安全?

3 个答案:

答案 0 :(得分:4)

“将0分配给迭代器并检查0是否安全?”否。

答案 1 :(得分:0)

您不能将0指定给迭代器,您必须使用其他一些特殊值,例如end()

答案 2 :(得分:0)

您应该如下所示实施next,并且还应该提供has_next()来检查列表中是否有下一个项目。

Itr next()
{
   if ( !has_next() )
       _lastPostition = _internalList.begin();
   return ++_lastPostition;
}
bool has_next() const
{
   Itr  temp = lastPostition;
   return (++temp== _internalList.end());
}

注意:next()的行为是循环的;也就是说,在到达终点时,它会再次开始!