Привіт! В даній статті обговорюється алгоритм 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 ;
}
Після компілювання і виконання даної пограми, у термінали може з'явитится наступна інформація:
Отже ми знайшли "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 ;
}
Переглянемо введення до програми: