Шаг 278.
Библиотека STL.
Алгоритмы STL. Сравнение интервалов. Проверка на равенство

    На этом шаге мы рассмотрим алгоритмы, использующиеся для осуществления проверки на равенство интервалов.

    Для сравнения двух интервалов можно использовать следующие алгоритмы:

  bool
  equal (InputIterator1 beg, InputIterator1 end, 
         InputIterator2 cmpBeg)
  bool
  equal (InputIterator1 beg, InputIteratorl end,
         Inputlterator2 cmpBeg,
         BinaryPredicate op)

    Первая форма проверяет полное совпадение элементов интервалов [beg,end) и [cmpBeg,...) и возвращает результат в виде логической величины.

    Вторая форма проверяет, что каждый вызов бинарного предиката op(elem, cmpElem) для соответствующих элементов интервалов [beg,end) и [cmpBeg,...) возвращает true.

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

    Перед вызовом необходимо убедиться в том, что интервал, начинающийся с cmpBeg, содержит достаточное количество элементов.

    Для выявления различий в случае несовпадения интервалов следует использовать алгоритм mismatch() (смотри 279 шаг).

    Сложность линейная (не более numberOfElements сравнений или вызовов ор соответственно).

    Следующий пример демонстрирует использование обеих форм алгоритма equal(). Первый вызов проверяет равенство элементов в двух интервалах, а второй вызов при помощи вспомогательной предикатной функции проверяет совпадение соответствующих элементов двух коллекций по четности/нечетности.

//---------------------------------------------------------------------------

#include <vcl.h>
#include <iterator>
#include "algostuff.hpp"

#include <conio.h> //необходимо для getch()

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
using namespace std;

std::string ToRus(const std::string &in)
{
  char *buff = new char [in.length()+1];
  CharToOem(in.c_str(),buff);
  std::string out(buff);
  delete [] buff;
  return out;
}

bool bothEvenOrOdd (int elem1, int elem2)
{
  return elem1 % 2 == elem2 % 2;
}


int main()
{
  vector<int> coll1;
  list<int> coll2;

  INSERT_ELEMENTS(coll1,1,7);
  INSERT_ELEMENTS(coll2,3,9);

  PRINT_ELEMENTS(coll1,"Вектор:\n");
  PRINT_ELEMENTS(coll2,"Список:\n");

  // Проверка равенства двух коллекций
  if (equal (coll1.begin(), coll1.end(),  // Первый интервал
             coll2.begin())) {            // Второй интервал
    cout << ToRus("Вектор == Списку") << endl;
  }
  else {
    cout << ToRus("Вектор != Списку") << endl;
  }

  // Проверка соответствия четности/нечетности элементов
  if (equal (coll1.begin(), coll1.end(),  // Первый интервал
             coll2.begin(),               // Второй интервал
             bothEvenOrOdd)) {            // Критерий сравнения
      cout << ToRus("Есть совпадение по четности/нечетности") << endl;
  }
  else {
      cout << ToRus("Нет совпадения по четности/нечетности") << endl;
  }


  getch();
  return 0;
}

//---------------------------------------------------------------------------
Текст этого примера можно взять здесь.

    Программа выводит следующий результат:


Рис.1. Результат работы приложения

    На следующем шаге мы рассмотрим поиск первого несовпадения.




Предыдущий шаг Содержание Следующий шаг