Бывают случаи, когда я хочу использовать итератор, возвращаемый функцией из библиотеки алгоритмов. Проблема, с которой я сталкиваюсь, возникает, когда я переключаюсь между изменяющей функцией и немодулирующей функцией. Причина в не изменяющейся функции я хочу использовать const_iterator
. Как игрушечный пример:Есть ли make_const_iterator?
vector<int> v = { 1, 8, 7, 4, 3, 6, 2, 5 };
auto it = partition(begin(v), end(v), bind(greater<int>(), placeholders::_1, 3));
cout << (find(cbegin(v), it, 13) != cend(v)) << endl;
Когда я пытаюсь скомпилировать этот код, я получаю ошибку:
no matching function for call to
find(std::vector<int>::const_iterator, __gnu_cxx::__normal_iterator<int*, std::vector<int> >&, int)
Проблема Я бегу в это единственный процесс преобразования я могу найти потенциально дорого: auto cit = next(cbegin(v), distance(begin(v), it))
Есть ли способ, которым я могу сделать эту работу? Или я застрял преобразование или просто используя не const_iterator
s?
Просто упреждающий комментарий, я знаю, что я мог бы просто использовать 'find' непосредственно на' V'. Я не ищу лучшего способа написать свой пример с игрушкой; Я ищу решение проблемы, которую он иллюстрирует. –
Вы пытались просто построить const_iterator из обычного? – rubenvb
Можно ли предположить, что тип исходного контейнера неизвестен? Если нет, 'decltype (v) :: const_iterator (it)' делает трюк. Использование 'cvegin (v)' в предлагаемом решении, по-видимому, подразумевает, что у вас есть доступ к 'v', а не только к итератору. –