Может пригодиться некоторая ясность при первом использовании std ::distance

#c #stl #iterator

#c #stl #итератор

Вопрос:

У меня есть векторная переменная с именем ‘cache’ (в которой хранятся строки, но я не думаю, что это необходимая информация).

Я хочу найти последнее вхождение переменной ‘latest’, строки, конечно, в этом векторном «кэше». Я использую std::find. Поскольку я хочу найти последнее вхождение вместо первого, я использую обратные итераторы, как показано здесь:

 find(cache.rbegin(), cache.rend(), latest)
  

Это возвращает, как и ожидалось. Теперь я хочу найти расстояние между первым элементом ‘cache’ и этим возвращаемым итератором (местом последнего вхождения ‘latest’ в ‘cache’).

Поэтому я стараюсь:

 distance(cache.begin(), find(cache.rbegin(), cache.rend(), latest))
  

Или, более наглядно:

 auto it = find(cache.rbegin(), cache.rend(), latest)

distance(cache.begin(), it)
  

Но я получаю «Нет соответствующей функции для вызова ‘distance'».

Я знаю, что это просто, но я искал около часа, поэтому пришел сюда. Любая информация будет оценена. Не уверен, что я делаю неправильно.

Комментарии:

1. Вы #include <iterator> и квалифицировались с правильным пространством std::distance имен?

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

Ответ №1:

Вы пытаетесь вычислить расстояние между обратным итератором и обычным итератором. Типы двух аргументов to std::distance должны быть одинаковыми. Попробуйте это вместо:

 size_t dist_from_begin =
    std::distance(find(cache.rbegin(), cache.rend(), latest), cache.rend());
  

Комментарии:

1. @JerryCoffin Нет, это не так. Это дает расстояние от rend , которое является началом 🙂

2. это действительно дает правильный ответ, спасибо и спасибо Джерри Коффину!!

3. У меня такое чувство, что это может закончиться одним, но я думаю, это в основном то, что @JerryCoffin прокомментировал ранее

Ответ №2:

Прямо сейчас вы пытаетесь выполнить вызов distance с помощью одного прямого итератора и одного обратного итератора, но ожидается, что он будет иметь дело с двумя итераторами одного и того же типа.

Чтобы заставить его работать, вам нужно получить «базу» обратного итератора, который будет прямым итератором в том же месте.

 auto it = find(cache.rbegin(), cache.rend(), latest)

distance(cache.begin(), it.base());
  

Вы также могли бы использовать:

 distance(cache.rbegin(), it);
  

…но это даст вам расстояние от конца до найденного вами элемента, а не расстояние от начала, поэтому он будет скомпилирован, но даст неправильный ответ.

Ответ №3:

Здесь вы смешиваете разные типы итераторов. it является обратным итератором и cache.begin() возвращает обычный итератор, distance ему это не нравится.