Привіт! В даній статті обговорюється алгоритм search з стандартної бібліотеки шаблонів C++. Оголошення алгоритму відбувається приблизно наступним чином:
template <class ForwardIterator1, class ForwardIterator2>
ForwardIterator1 search (ForwardIterator1 begin1, ForwardIterator1 end1,
                         ForwardIterator2 begin2, ForwardIterator2 end2) ;
Алгоритм std::search за своїм функціоналом подібний до алгоритму std::find, окрім того, що алгоритм std::search виконує пошук не одного елементу, а цілої послідовності елементів того ж типу, що і послідовність в якій виконується пошук. Даній версії алгоритму std::search передаються чотири параметри ітератори: перші два, begin1, і end1, призначені для вказування послідовності у якій буде виконуватися пошук; параметри ітератори begin2 і end2 призначені для вказування яку саме послідовность необхідно шукати. В результаті своєї діяльності, функція повертає ітератор, який вказує на перший елемент з проміжку [begin1, end1), який повністю співпадає з проміжком [begin2, end2), або end1, якщо пошук не дав результату.

Приклади

Приклад #1

Розглянемо простий приклад використання алгоритму std::search - пошук підрядка в рядку.
#include <iostream> /* об'єкт cout  */
#include <algorithm> /* усі корисні алгоритми */
#include <string> /* клас string */
using namespace std ; /* пишемо усе без std */

/* головна функція програми */
int main (int argc, char** argv) 
{
  /* створюємо об'єкт класу string У якому будемо виконувати пошук*/
  string big = "C++ makes me happy!" ;
  /* створюємо послідовність яку будемо шукати у об'єкті big */
  string sub = "happy" ;
  
  /* ітератор який буде вказувати на початок знайденої послідовності */
  string::iterator result ;
  
  /* виконуємо пошук */
  result = search (big.begin(), big.end(), /* ітератори проміжку пошуку */
                   sub.begin(), sub.end()) ; /* ітератори шуканої послідовності */
                   
  /* перевіряємо результат пошуку значення змінної sub у big 
  ** і виводимо відповідний результат у термінал */
  if (result!=big.end())
  {
    cout << "String \"" << sub << "\" is present in string \"" << big << "\"\n" ;
  }
  else
  {
    cout << "String \"" << sub << "\" isn`t present in string \"" << big << "\"\n" ;
  }
  
  return 0 ;
}
Після компілювання і виконання даної пограми, у термінали може з'явитится наступна інформація: cpp_std_search_sample1-cxx_demo_simple_search_demo_output Отже ми знайшли "happy" за допомогою алгоритму std::search.

Приклад #2

Уявимо собі, що у нас є програма для чатування. І деякі з користувачів полюбляють ввести "міцне" слівце у повідомленнях. Отже нам потрібно відфільтрувати повідомлення з стоп-словами і забанити користувача. "Міцні" слівця будуть міститись у об'єкті-контейнері класу std::vector. Моделлю даної чат-програми буде мала програма, яка буде виводити повідомлення надане їй в якості параметру в термінал. В разі знайденого стоп-слова, програма повинна вивести замість повідомлення бан.
#include <iostream> /* об'єкт cout */
#include <vector> /* клас vector для збереження стоп-слів */
#include <algorithm> /* усі корисні алгоритми */
#include <string> /* клас string */
using namespace std ; /* пишемо усе без std */

/* головна функція програми */
int main (int argc, char** argv) 
{
  /* перевіряємо кількість переданих аргументів програмі,
  ** перший параметр, як завжди, це назва програми */
  if (argc<2)
  {
    cout << "Enter your message before send!" << endl ;
    return 0 ;
  }
  
  vector<string> stop_words ;
  string::iterator siter ;
  string message ;
  
  /* отримуємо повідомлення в якості аргументу 
  ** повідомлення повинно бути обмежено лапками */
  message = argv [1] ;
  
  /* заповнюємо вектор стоп-слів, 
  ** такі дані зазвичай містяться у базі даних */
  stop_words.push_back (string("hell")) ;
  stop_words.push_back (string("devil")) ;
  
  /* виконуємо пошук стоп слів з вектору stop_words у об'єкті message */
  for (vector<string>::iterator viter=stop_words.begin();
       viter<stop_words.end();
       ++viter)
  {
    /* отримуємо посилання на стоп слово, на яке вказує ітератор viter */
    string& stop = *viter ;
    
    /* виконуємо пошук за допомогою алгоритму std::search */
    siter = search (message.begin (), message.end (),
                    stop.begin (), stop.end ()) ;
    
    /* якщо ітератор siter не вказує на кінець послідовності
    ** значить у message присутнє стоп-слово */
    if (siter!=message.end())
    {
      /* виводимо повідомлення і виходимо з програми */
      cout << "Stop-word \"" << stop << "\" was found, You`re banned!" << endl ;
      
      return 0 ;
    }
  }
  
  /* якщо відсутні стоп-слова - виводимо повідомлення у термінал */
  cout << message << endl ;
  
  return 0 ;
}
Переглянемо введення до програми: cpp_std_search_sample2-cxx_demo_program_for_chat_simulator_output