cpp

Поиск элементов

Для поиска элементов предназначены следующие функции:

  • find() — выполняет поиск элемента со значением val, внутри диапазона между first и last. Функция возвращает итератор на первый найденный элемент или итератор last, если элемент не найден. Сравнение производится с помощью оператора ==. Формат функции:
#include <algorithm>
iterator find(first, last, const _Tp &val);

Пример:

std::vector<int> arr = {1, 2, 3, 1, 2, 3};
auto it = std::find(arr.begin(), arr.end(), 3);
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 3
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 2
}
it = std::find(arr.begin(), arr.end(), 10);
if (it == arr.end()) {
   std::cout << "not found" << std::endl; // not found
}
  • count() — возвращает количество элементов со значением val внутри диапазона между first и last. Сравнение производится с помощью оператора ==. Формат функции:
#include <algorithm>
difference_type count(first, last, const _Tp &val);

Пример:

std::vector<int> arr = {1, 2, 3, 1, 2, 3};
std::cout << std::count(arr.begin(), arr.end(), 3)
          << std::endl; // 2
std::cout << std::count(arr.begin(), arr.end(), 5)
          << std::endl; // 0
  • find_if() — выполняет поиск элемента внутри диапазона между first и last. Функция возвращает итератор на первый найденный элемент, для которого функция сравнения pred вернула значение true, или итератор last, если элемент не найден. Формат функции:
#include <algorithm>
iterator find_if(first, last, pred);

Пример:

std::vector<int> arr = {1, 2, 3, 1, 2, 3};
auto it = std::find_if(arr.begin(), arr.end(),
               [](const int &x){ return x == 3; });
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 3
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 2
}
  • count_if() — возвращает количество элементов внутри диапазона между first и last, для которых функция сравнения pred вернула значение true. Формат функции:
#include <algorithm>
difference_type count_if(first, last, pred);

Пример:

std::vector<int> arr = {1, 2, 3, 1, 2, 3, 3, 3};
std::cout << std::count_if(arr.begin(), arr.end(),
                        [](const int &x){ return x == 3; })
          << std::endl; // 4
  • find_if_not() — выполняет поиск элемента внутри диапазона между first и last. Функция возвращает итератор на первый элемент, для которого функция сравнения pred вернула значение false, или итератор last, если такого элемента нет. Формат функции:
#include <algorithm>
iterator find_if_not(first, last, pred);

Пример:

std::vector<int> arr = {1, 2, 3, 1, 2, 3};
auto it = std::find_if_not(arr.begin(), arr.end(),
               [](const int &x){ return x == 3; });
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 1
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 0
}
  • binary_search() — возвращает значение true, если в отсортированном диапазоне между first и last существует элемент со значением val. По умолчанию сравнение производится с помощью оператора <. В параметре comp можно указать пользовательскую функцию сравнения. Обратите внимание: для поиска и сортировки должна использоваться одна и та же функция сравнения. Если диапазон не отсортирован, то поведение функции не определено. Формат функции:
#include <algorithm>
bool binary_search(first, last, const _Tp &val[, comp]);

Пример:

std::vector<int> arr = {1, 2, 1, 2, 5, 3};
std::sort(arr.begin(), arr.end());
std::cout << std::boolalpha;
std::cout << std::binary_search(arr.begin(), arr.end(), 3)
          << std::endl; // true
std::cout << std::binary_search(arr.begin(), arr.end(), 4)
          << std::endl; // false
  • lower_bound() — возвращает итератор, установленный на элемент из диапазона между first и last, значение которого больше или равно значению val. Если элемент не найден, то метод возвращает итератор, указывающий на позицию last. По умолчанию сравнение производится с помощью оператора <. В параметре comp можно указать пользовательскую функцию сравнения. Обратите внимание: для поиска и сортировки должна использоваться одна и та же функция сравнения. Если диапазон не отсортирован, то поведение функции не определено. Формат функции:
#include <algorithm>
iterator lower_bound(first, last, const _Tp &val[, comp]);

Пример:

std::vector<int> arr = {1, 2, 2, 4, 5};
std::sort(arr.begin(), arr.end());
auto it = std::lower_bound(arr.begin(), arr.end(), 2);
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 2
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 1
}
it = std::lower_bound(arr.begin(), arr.end(), 3);
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 4
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 3
}
  • upper_bound() — возвращает итератор, установленный на элемент из диапазона между first и last, значение которого больше значения val. Если элемент не найден, то метод возвращает итератор, указывающий на позицию last. По умолчанию сравнение производится с помощью оператора <. В параметре comp можно указать пользовательскую функцию сравнения. Обратите внимание: для поиска и сортировки должна использоваться одна и та же функция сравнения. Если диапазон не отсортирован, то поведение функции не определено. Формат функции:
#include <algorithm>
iterator upper_bound(first, last, const _Tp &val[, comp]);

Пример:

std::vector<int> arr = {1, 2, 2, 4, 5};
std::sort(arr.begin(), arr.end());
auto it = std::upper_bound(arr.begin(), arr.end(), 2);
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 4
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 3
}
  • equal_range() — возвращает экземпляр класса pair. Через свойство first будет доступен итератор, являющийся результатом выполнения функции lower_bound(), а через свойство second — итератор, являющийся результатом выполнения функции upper_bound(). Если диапазон не отсортирован, то поведение функции не определено. Формат функции:
#include <algorithm>
pair<iterator, iterator> equal_range(first, last,
                                     const _Tp &val[, comp]);

Пример:

std::vector<int> arr = {1, 2, 2, 4, 5};
std::sort(arr.begin(), arr.end());
auto pr = std::equal_range(arr.begin(), arr.end(), 2);
if (pr.first != arr.end()) {
   std::cout << *pr.first << std::endl;   // 2
   std::cout << std::distance(arr.begin(), pr.first)
             << std::endl;                // 1
}
if (pr.second != arr.end()) {
   std::cout << *pr.second << std::endl;  // 4
   std::cout << std::distance(arr.begin(), pr.second)
             << std::endl;                // 3
}
  • adjacent_find() — выполняет поиск двух соседних элементов внутри диапазона между first и last. Функция возвращает итератор на первый элемент из первой пары, если значения двух элементов равны, или итератор last, если таких элементов нет. По умолчанию сравнение производится с помощью оператора ==. В параметре binary_pred можно указать пользовательскую функцию сравнения. Формат функции:
#include <algorithm>
iterator adjacent_find(first, last[, binary_pred]);

Пример:

std::vector<int> arr = {1, 2, 2, 3, 3, 2, 2, 3, 3};
auto it = std::adjacent_find(arr.begin(), arr.end());
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 2
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 1
}
it = std::adjacent_find(arr.begin(), arr.end(),
          [](const int &a, const int &b){ return a == b; });
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 2
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 1
}
  • search_n() — выполняет поиск count соседних элементов со значением val внутри диапазона между first и last. Функция возвращает итератор на первый элемент из последовательности или итератор last, если ничего не найдено. По умолчанию сравнение производится с помощью оператора ==. В параметре binary_pred можно указать пользовательскую функцию сравнения. Формат функции:
#include <algorithm>
iterator search_n(first, last,
                  count, const _Tp &val[, binary_pred]);

Пример:

std::vector<int> arr = {1, 2, 2, 3, 3, 2, 2, 3, 3};
auto it = std::search_n(arr.begin(), arr.end(), 2, 3);
if (it != arr.end()) {
   std::cout << *it << std::endl;         // 3
   std::cout << std::distance(arr.begin(), it)
             << std::endl;                // 3
}
  • search() — производит поиск последовательности элементов из фрагмента между first2 и last2 внутри диапазона между first1 и last1. Функция возвращает итератор на первый элемент первого вхождения фрагмента в диапазон или итератор last1, если ничего не найдено. По умолчанию сравнение производится с помощью оператора ==. Формат метода:
#include <algorithm>
iterator search(first1, last1, first2, last2[, binary_pred]);

Пример:

std::string str1("abb abc abc abd"), str2("abc");
auto it = std::search(str1.begin(), str1.end(),
                      str2.begin(), str2.end());
if (it != str1.end()) {
   std::cout << *it << std::endl;         // a
   std::cout << std::distance(str1.begin(), it)
             << std::endl;                // 4
}

В параметре binary_pred можно указать пользовательскую функцию сравнения. Сделаем поиск не зависящим от регистра символов:

// #include <string.h>
std::string str1("abb abc abc abd"), str2("ABC");
auto it = std::search(str1.begin(), str1.end(),
                      str2.begin(), str2.end(),
                  [](const char &a, const char &b){
                  return std::tolower(a) == std::tolower(b); });
if (it != str1.end()) {
   std::cout << *it << std::endl;         // a
   std::cout << std::distance(str1.begin(), it)
             << std::endl;                // 4
}
  • find_end() — аналогична функции search(), но возвращает итератор на первый элемент последнего вхождения фрагмента в диапазон или итератор last1, если ничего не найдено. По умолчанию сравнение производится с помощью оператора ==. В параметре binary_pred можно указать пользовательскую функцию сравнения. Формат метода:
#include <algorithm>
iterator find_end(first1, last1, first2, last2[, binary_pred]);

Пример:

std::string str1("abb abc abc abd"), str2("abc");
auto it = std::find_end(str1.begin(), str1.end(),
                        str2.begin(), str2.end());
if (it != str1.end()) {
   std::cout << *it << std::endl;         // a
   std::cout << std::distance(str1.begin(), it)
             << std::endl;                // 8
}
  • find_first_of() — производит поиск любого элемента из набора между first2 и last2 внутри диапазона между first1 и last1. Функция возвращает итератор на первый найденный элемент из набора или итератор last1, если ничего не найдено. По умолчанию сравнение производится с помощью оператора ==. В параметре binary_pred можно указать пользовательскую функцию сравнения. Формат метода:
#include <algorithm>
iterator find_first_of(first1, last1,
                       first2, last2[, binary_pred]);

Пример:

std::vector<int> arr1 = {1, 2, 3, 1, 2, 3}, arr2 = {0, 5, 3};
auto it = std::find_first_of(arr1.begin(), arr1.end(),
                             arr2.begin(), arr2.end());
if (it != arr1.end()) {
   std::cout << *it << std::endl;         // 3
   std::cout << std::distance(arr1.begin(), it)
             << std::endl;                // 2
}
  • mismatch() — производит поиск первой позиции, где два диапазона отличаются. Первый диапазон задается с помощью итераторов first1 и last1, а второй диапазон начинается с позиции first2. Функция возвращает объект класса pair с двумя итераторами. Первый итератор ссылается на первый отличающийся элемент из диапазона между first1 и last1 или на позицию last1, если ничего не найдено. Второй итератор ссылается на первый отличающийся элемент из второго диапазона. По умолчанию сравнение производится с помощью оператора ==. В параметре binary_pred можно указать пользовательскую функцию сравнения. Формат метода:
#include <algorithm>
pair<iterator, iterator> mismatch(first1, last1,
                                  first2[, binary_pred]);

Пример:

std::vector<int> arr1 = {1, 2, 3}, arr2 = {1, 2, 4};
auto pr = std::mismatch(arr1.begin(), arr1.end(),
                        arr2.begin());
if (pr.first == arr1.end()) {
   std::cout << "arr1 == arr2" << std::endl;
}
else {
   std::cout << *pr.first << std::endl;   // 3
   std::cout << *pr.second << std::endl;  // 4
   std::cout << std::distance(arr1.begin(), pr.first)
             << std::endl;                // 2
}

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp