Как получить гарантированный неверный итератор (для вектора)? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть контейнерный класс, который по существу (показывает только соответствующие части)

class Foo {
    typedef std::map<int, std::vector<int>> data_t;
    data_t data;
    struct iterator {
        data_t::iterator major_it;
        data_t::mapped_type::iterator minor_it;
        // ...
    };
    iterator begin();
    iterator end() {
        return { data.end(), /* XXX */ };
    }
};

Как видите, я хочу, чтобы итератор был реализован для этого контейнера.Итератор должен проходить через каждый узел в карте, а итератор - через каждый элемент в векторе, к которому относится этот узел.У меня нет проблем с реализацией итератора, но у меня возникли проблемы с реализацией end() для контейнера.

Итератор состоит из двух уровней итераторов, а для итератора последнего конца major_it придетсябыть data_t.end(), но у меня не будет ничего для инициализации minor_it.

В том же духе, begin() также будет сломан, когда карта пуста.

Любая идея

1 Ответ

0 голосов
/ 25 апреля 2018

std::vector::iterator всегда недопустимо при инициализации значения:

std::vector<…>::iterator invalid_iter_value = {};

Кстати, непригодно при инициализации по умолчанию (то есть неинициализировано), что может быть достаточно для вас.Если major_it уже находится в конце, то просто не обращайтесь к minor_it.

std::vector<…>::iterator unusable_iter_value;

Однако обратите внимание, что копировать объект, инициализированный по умолчанию, также недопустимо, поэтому инициализация значенияхорошая идея, если вы не настраиваете конструктор и оператор копирования.

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