std::iterator и пользовательский итератор

  1. Почему не получается так сделать? Ведь vector<int> :: iterator в моём понимании унаследован от random_access_iterator.

    vector<int> vec({5, 4, 2, 3, 1});

    vector<int> :: iterator it = vec.begin()

    const iterator<random_access_iterator_tag, int>& i = it;

  2. Нужно сделать, чтобы метод класса контейнера принимал и std::iterator и MyIterator, который уже написан мной. Думал, что можно было бы базовый класс.

  3. Как можно решить проблему пункта 2.


Ответы (1 шт):

Автор решения: nyekitka

На самом деле, итератор вектора не наследуется от random_access_iterator. Итератор вектора - отдельная структура в которой просто прописан его тэг следующим образом:

using iterator_category = random_access_iterator_tag;

Вашу проблему можно решить следующим образом (используется стандарт C++20)

#include <iterator>
//...
template <std::random_access_iterator Iter>
return_type method_name(const Iter& iter, ...) {
    //...
}

Тогда ваш метод сможет принимать все итераторы, являющиеся random access.

→ Ссылка