Что означает этот пример использования boost :: mismatch?

Я пытаюсь понять следующий пример Вот:

template<class SinglePassRange1, class SinglePassRange2>
std::pair <
typename range_iterator<SinglePassRange1>::type,
typename range_iterator<const SinglePassRange2>::type
>
mismatch(SinglePassRange1& rng1, const SinglePassRange2& rng2);

А вот и описание:

Несоответствие находит первую позицию, где соответствующие элементы
из двух диапазонов rng1 и rng2 не равны.

Главное, что мне не понятно в приведенном выше примере: Что дается в качестве входа и что является выходом функции несоответствия?

rng1 а также rng2 являются объектом классов SinglePassRange1 а также SinglePassRange2соответственно. Но что это за классы? Где они определены? Они должны быть «диапазонами», но что такое «диапазоны»?

Мне также не ясно, что все эти строки до вызова mismatch Функция сделать. Первая строка выглядит так, как будто мы собираемся определить шаблон класса, но мы не будем делать это позже.

2

Решение

Диапазон — это пара итераторов, работающих в одном контейнере. SinglePassRange такой диапазон, где итераторы являются однопроходными итераторами, т.е. итераторы, которые сравнимы и увеличиваемы. Перегружая mismatch функции, параметры также могут быть контейнерами, поддерживающими этот тип итераторов диапазона, в этом случае begin() а также end() используются итераторы контейнера.

Возвращаемым значением является первая пара итераторов — по одному из каждого диапазона — которые не удовлетворяют предикату равенства. Эта пара — то, что описывает первая пара строк после объявления параметра шаблона.

std::pair <
typename range_iterator<SinglePassRange1>::type,
typename range_iterator<const SinglePassRange2>::type
>

Как видите, каждый аргумент является типом итератора диапазона каждого типа диапазона.

Ключевое слово typename перед аргументами необходимо, потому что оба на самом деле зависимые имена, то есть. типы, определенные в других типах, которые сами зависят от параметров внешнего шаблона (SinglePassRange1 и 2).

mismatch Функция, вероятно, похожа на следующее (типы elided):

 auto mismatch(auto &rng1, auto &rng2){
auto it1 = rng1.first, it2 = rng2.first;
while (it1 != rng1.second && it2 != rng2.second)
if (it1 != it2)
break;
else { ++it1; ++it2; }
return make_pair(it1, it2);
}
2

Другие решения

Мне также не ясно, что все эти строки до вызова
функция несоответствия сделать. Первая строка выглядит так, как будто мы собираемся
определить шаблон класса, но мы не будем делать это позже.

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

Главное, что мне не понятно в приведенном выше примере:
дается как вход, и что является выходом функции несоответствия?

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

Более подробная информация о диапазонах усиления доступна на http://www.boost.org/doc/libs/1_50_0_beta1/libs/range/doc/html/range/introduction.html

Как уже упоминалось, наиболее распространенное использование — проходить в стандартных контейнерах. Встроенные массивы также работают. А также boost::iterator_range позволяет использовать любую пару (прямых) итераторов, образующих диапазон.

Так что вы могли бы иметь

vector<string> vec { ... };
list<string> lis { ... };

auto result = mismatch(vec, lis);

Вот result будет иметь тип pair<boost::range_iterator<vector<string>>::type, boost::range_iterator<list<string>>::type>

1

По вопросам рекламы [email protected]