Ответ 1
std::equal
- это шаблон функции, который вы ищете.
if (std::equal(v1.begin() + 1, v1.end() - 1, v2.begin())
{
std::cout << "Alright\n";
}
Обратите внимание, что std::equal
принимает только три аргумента, а не четыре.
По диапазону я имею в виду пару итераторов. В псевдо С++:
std::vector<int> v1 = { 1, 2, 3, 4, 5 };
std::vector<int> v2 = { 2, 3, 4 };
if( std::compare_range( v1.begin() + 1, v1.end() - 1, v2.begin(), v2.end() ) {
std::cout << "Alright\n";
}
compare_range
- это, конечно, функция, которую я ищу.
Отказ от ответственности: это довольно простая функция для записи, я знаю. Но, как и все программисты, я стараюсь быть ленивым; -)
std::equal
- это шаблон функции, который вы ищете.
if (std::equal(v1.begin() + 1, v1.end() - 1, v2.begin())
{
std::cout << "Alright\n";
}
Обратите внимание, что std::equal
принимает только три аргумента, а не четыре.
Используйте std::equal
- он также поддерживает диапазоны.
Кажется, что нет стандартного метода "одна функция". Упомянутый std:: equal предполагает, что второй диапазон не короче первого. Например, это может привести к повреждению памяти, когда второй интервал пуст. Он также не дает ответа, когда второй диапазон больше.
Требуется сочетание std:: equal и std:: distance или самозаписывающей функции:
template <class InputIterator1, class InputIterator2>
bool safe_equal( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2 )
{
return ( std::distance( first1, last1 ) == std::distance( first2, last2 ) )
&& std::equal( first1, last1, first2 );
}
Функция выше может пересекать сдерживатель дважды для нетераторов случайного доступа, но использует стандартные функции. Возможно, разумно написать собственную реализацию, если это неприемлемо.
Если у вас есть способ определить, что два диапазона имеют
точно такое же количество элементов, std::equal
. В
практика, это, кажется, не так, что часто для меня,
и большинство применений, которые у меня есть std::equal
, на самом деле
определение того, является ли один диапазон префиксом другого.
Для фактических сравнений я нашел std::lexicographical_compare
чтобы быть более полезным, хотя отношения, которые оно
порядка, а не эквивалентности. Для эквивалентности вы можете применить его
дважды, например,
!lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())
&& !lexicographical_compare(b.begin(), b.end(), a.begin(), a.end())
но это в значительной степени означает сравнение элементов дважды (за исключением в начале есть различие).
В Boost есть функция, которая также проверяет размер диапазонов:
boost::range::equal