Шаг 252.
Библиотека STL.
Объекты функций STL. Бинарные композиционные адаптеры

    На этом шаге мы рассмотрим пример использования бинарного композиционного адаптера.

    Один из бинарных композиционных адаптеров обрабатывает результат двух унарных операций, которым передаются разные элементы. Назовем этот адаптер compose_f_gx_hy. Возможная реализация выглядит так:

#include <functional>

// Класс композиционнного адаптера compose_f_gx_hy
template <class OP1, class OP2, class OP3>
class compose_f_gx_hy_t
 : public std::binary_function<typename OP2::argument_type,
                               typename OP3::argument_type,
                               typename OP1::result_type>
{
  private:
    OP1 op1;    // Вычисление: op1(op2(x),op3(y))
    OP2 op2;
    OP3 op3;
  public:
    // Конструктор
    compose_f_gx_hy_t (const OP1& o1, const OP2& o2, const OP3& o3)
     : op1(o1), op2(o2), op3(o3) {
    }

    // Вызов функции
    typename OP1::result_type
    operator()(const typename OP2::argument_type& x,
               const typename OP3::argument_type& y) const {
        return op1(op2(x),op3(y));
    }
};

// Вспомогательная функция для композиционного адаптера compose_f_gx_hy
template <class OP1, class OP2, class OP3>
inline compose_f_gx_hy_t<OP1,OP2,OP3>
compose_f_gx_hy (const OP1& o1, const OP2& o2, const OP3& o3) {
    return compose_f_gx_hy_t<OP1,OP2,OP3>(o1,o2,o3);
}

    В следующем примере демонстрируется применение адаптера compose_f_gx_hy. В нем производится поиск подстроки без учета регистра символов (регистр не учитывается только для латинского алфавита):

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

#include <vcl.h>
#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>
#include <functional>

#include "compose22.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;
}

int main()
{
//  string s("Internationalization");
//  string sub("Nation");
  string s("Например");
  string sub("пример");

  // Поиск подстроки без учета регистра символов (для латинских букв)
  string::iterator pos;
  pos = search (s.begin(),s.end(),           // Строка
                sub.begin(),sub.end(),       // Искомая подстрока
                compose_f_gx_hy(equal_to<int>(), // Критерий сравнения
                                ptr_fun(::toupper),
                                ptr_fun(::toupper)));

    if (pos != s.end()) {
        cout << "\"" << ToRus(sub) << "\"" << ToRus(" часть ") 
             << "\"" << ToRus(s) << "\"" << endl;
    }


  getch();
  return 0;
}

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

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


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

    Со следующего шага мы начнем рассматривать алгоритмы STL.




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