Я пытаюсь понять следующий пример Вот:
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
Функция сделать. Первая строка выглядит так, как будто мы собираемся определить шаблон класса, но мы не будем делать это позже.
Диапазон — это пара итераторов, работающих в одном контейнере. 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);
}
Мне также не ясно, что все эти строки до вызова
функция несоответствия сделать. Первая строка выглядит так, как будто мы собираемся
определить шаблон класса, но мы не будем делать это позже.
Это не пример. Это декларация функция шаблон, который является частью библиотеки расширенного диапазона.
Главное, что мне не понятно в приведенном выше примере:
дается как вход, и что является выходом функции несоответствия?
Как описано ниже на странице, на которую вы ссылаетесь, вход должен иметь тип, который является моделью концепции однопроходного диапазона.
Более подробная информация о диапазонах усиления доступна на 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>