Подтвердить что ты не робот

Есть ли стандартный способ сравнения двух диапазонов в С++?

По диапазону я имею в виду пару итераторов. В псевдо С++:

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 - это, конечно, функция, которую я ищу.

Отказ от ответственности: это довольно простая функция для записи, я знаю. Но, как и все программисты, я стараюсь быть ленивым; -)

4b9b3361

Ответ 1

std::equal - это шаблон функции, который вы ищете.

if (std::equal(v1.begin() + 1, v1.end() - 1, v2.begin())
{
    std::cout << "Alright\n";
}

Обратите внимание, что std::equal принимает только три аргумента, а не четыре.

Ответ 2

Используйте std::equal - он также поддерживает диапазоны.

Ответ 3

Кажется, что нет стандартного метода "одна функция". Упомянутый 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 );
}

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

Ответ 4

Если у вас есть способ определить, что два диапазона имеют точно такое же количество элементов, 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())

но это в значительной степени означает сравнение элементов дважды (за исключением в начале есть различие).

Ответ 5

В Boost есть функция, которая также проверяет размер диапазонов:

boost::range::equal