C ++ итератор для const_iterator - PullRequest
18 голосов
/ 13 октября 2011

Как мне получить const_iterator из iterator в C ++? А как насчет const_iterator из insert_iterator? Результирующий iterator должен указывать на то же место, что и оригинал.

Ответы [ 2 ]

24 голосов
/ 13 октября 2011

Контейнеры должны предоставлять iterator как тип, конвертируемый в const_iterator, поэтому вы можете неявно преобразовывать:

Container::iterator it = /* blah */;
Container::const_iterator cit = it;

std::insert_iterator s - итераторы вывода. Это не дает возможности преобразовать их в обычный Container::iterator, который должен быть прямым итератором.

Итератор вставки другого типа может разрешать такие вещи, но те, что получены из стандартных функций, не позволяют.

Полагаю, вы можете написать свою собственную обертку вокруг std::insert_iterator, которая выставляет защищенного члена iter, хотя:

template <typename Container>
class exposing_insert_iterator : public std::insert_iterator<Container> {
public:
    exposing_insert_iterator(std::insert_iterator<Container> it)
    : std::insert_iterator<Container>(it) {}
    typename Container::iterator get_iterator() const {
        return std::insert_iterator<Container>::iter;
    }
};

// ...
std::insert_iterator<Container> ins_it;
exposing_insert_iterator<Container> exp_it = ins_it;
Container::iterator it = exp_it.get_iterator();
5 голосов
/ 13 октября 2011

Вы можете конвертировать их.Пример:

std::vector<int> v;
std::vector<int>::iterator it = v.begin();
std::vector<int>::const_iterator cit = it;

Но я думаю, это не тот ответ, который вы ищете.Покажите мне код.: -)

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