Будут ли нулевые итераторы вызывать неопределенное поведение? - PullRequest
3 голосов
/ 21 марта 2011
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 ]

4 голосов
/ 21 марта 2011

"Безопасно ли присваивать 0 итератору и проверять на 0?"Нет.

0 голосов
/ 21 марта 2011

Вы должны реализовать 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() является круговым; то есть, по достижении конца, возвращение начинается снова!

0 голосов
/ 21 марта 2011

Итератору нельзя присвоить 0, нужно использовать другое специальное значение, например end().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...