Дайте примеры циклов с иттераторами

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

All complete. Допустимо ли сравнение иттератора с эндом продублировать приведением иттератора к bool, то есть поддерживать и

Код: Выделить всё

for (Itterator=List.Begin(); Itterator!=List.End(); ++Itteratir)
и

Код: Выделить всё

for (Itterator=List.Begin(); (bool)Itterator; ++Itteratir)
?
А если иттератор реверсивен, то как его запускать с конца? Как синтаксически выглядит перебор реверсивным иттератором назад? Оператором декремента? А сравнивать с чем? Как сюда:

Код: Выделить всё

class TSimpleList
{
public:
    class Node
    {
    public:
        Node(): Prev(nullptr), Next(nullptr)
        {
        }
        Node *Prev;
        Node *Next;
    };

    class Iterator
    {
    public:
        Iterator() : m_node(nullptr)
        {
        }
        Iterator(Node *n)
        {
            m_node = n;
        }
        void operator++()
        {
            if (m_node != nullptr)
            {
                m_node = m_node->Next;
            }
        }
        bool operator!=(const Iterator& it)
        {
            return (m_node != it.m_node);
        }
    private:
        Node *m_node;
    };

    TSimpleList() : m_pBegin(&m_end)
    {
    }
    ~TSimpleList()
    {
        // удаление элементов списка
        while (m_end.Prev != nullptr)
        {
            Node *Last = m_end.Prev;
            m_end.Prev = Last->Prev;
            delete Last;
        }
    }
    Iterator Begin()
    {
        return m_pBegin;
    }
    Iterator End()
    {
        return &m_end;
    }
    void Add()
    {
        if (&m_end != m_pBegin)
        {
            Node *it = new Node();
            Node *Last = m_end.Prev;
            Last->Next = it;
            m_end.Prev = it;
            it->Next = &m_end;
        } else
        {
            m_pBegin = new Node();
            m_pBegin->Next = &m_end;
            m_end.Prev = m_pBegin;
        }
    }
private:
    Node m_end;
    Node* m_pBegin;
};

int tmain()
{
    TSimpleList sl;
    TSimpleList::Iterator it;
    sl.Add();
    sl.Add();
    sl.Add();

    for (it = sl.Begin(); it != sl.End(); ++it)
    {
        _puttch('.');
    }

    _gettch();

    return 0;
}
прикрутить исключение при разыменовании иттератора терминального элемента?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Сионист писал(а): А если итератор реверсивен, то как его запускать с конца? Как синтаксически выглядит перебор реверсивным итератором назад? Оператором декремента? А сравнивать с чем? Как сюда: прикрутить исключение при разыменовании итератора терминального элемента?
В стандартной библиотеке шаблонов STL для этого предусмотрен специальный реверсивный итератор. Используется он так...

Код: Выделить всё

	std::list<long> ls;
	std::list<long>::reverse_iterator rev;
	// TODO: добавить элементы в список...
	for (rev = ls.rbegin(); rev != ls.rend(); ++rev)
	{
		cout << *rev << ' ';
	}
Для моего примера так же нужно будет добавить методы RevBegin() и RevEnd(), реализовать дополнительный класс ReverceIterator.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

All complete. А с вопросами из поста #11 как?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить