1 2 3 4 5 6 7 8 9 10 11 |
//C++ STL Листинг #1.1 find #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ vector<int> v = {77, 88, 99, 111, 2222}; //для сокращения кода я сразу инициализировал вектор значениями find(v.begin(), v.end(), 99); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//C++ STL Листинг #1.2 find #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {77, 88, 99, 111, 2222}; if (find(v.begin(), v.end(), 99) != v.end()){ //Проверяем на достижение v.end() cout << "Элемент 99 найден\n"; } else { cout << "Элемент 99 не найден\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
//C++ STL Листинг #1.3 find #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {77, 88, 99, 111, 2222}; cout << find(v.begin() , v.end(), 88)) - v.begin() << '\n'; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
//C++ STL Листинг #1.3 find #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {77, 88, 99, 111, 2222}; vector<int>::iterator it; it = find(v.begin(), v.end(), 99); if (it != v.end()){ cout << it - v.begin() << '\n'; } else { cout << "элемента нет в векторе\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//C++ STL Листинг #2.1 find_if #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; bool my_pred(int value){ //Функция (фрагмент кода) для поиска по критерию if (value > 10){ return true; } return false; } int main(){ setlocale(LC_ALL, ""); vector<int> v = {7, 88, 99, 111, 2222}; vector<int>::iterator it; //Итератор для хранения результата работы алгоритма it = find_if(v.begin(), v.end(), my_pred); //запоминаем результат if (it != v.end()){ //если алгоритм не добрался до конца вектора cout << *it << "найден: "; //то элемент, удовлетворяющий условию поиска, нашёлся } } |
1 2 3 |
bool my_pred(int value){ //Функция (фрагмент кода) для поиска по критерию return value > 10; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//C++ STL Листинг #2.2 find_if #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {7, 88, 99, 111, 2222}; vector<int>::iterator it100; vector<int>::iterator it200; it100 = find_if(v.begin(), v.end(), [](int value){ return value > 100; }); it200 = find_if(v.begin(), v.end(), [](int value){ return value > 200; }); if (it100 != v.end()){ //если алгоритм не добрался до конца вектора cout << *it100 << ">100 найден "; //то элемент, удовлетворяющий условию поиска, нашёлся } cout << '\n'; if (it200 != v.end()){ //если алгоритм не добрался до конца вектора cout << *it200 << ">200 найден "; //то элемент, удовлетворяющий условию поиска, нашёлся } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//C++ STL Листинг #2.3 find_if #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {7, 88, 99, 111, 2222}; vector<int>::iterator it; //Итератор для сохранения результатов работы алгоритма vector<int>::iterator beg; //Итератор для отслеживания последней найденной позиции beg = v.begin(); //Устанавливаем отслеживатель позиции на начало вектора while (it != v.end()){ it = find_if(beg, v.end(), [](int value){ return value > 100; }); if (it != v.end()){ cout << *it << '\n'; //будут выведены все элементы, большие 100 } beg = it + 1; //Устанавливаем отслеживатель за найденный элемент } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//C++ STL Листинг #2.4 find_if #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {7, 88, 99, 111, 2222}; vector<int>::iterator it; //Итератор для сохранения результатов работы алгоритма vector<int>::iterator beg; //Итератор для отслеживания последней найденной позиции beg = v.begin(); //Устанавливаем отслеживатель позиции на начало вектора int number = 100; //число для сравнения while (it != v.end()){ it = find_if(beg, v.end(), [number](int value){ return value > number; }); if (it != v.end()){ cout << "v[" << it - v.begin() << "]" << "==" << *it << " > " << number << '\n'; //будут выведены все элементы, большие 100 } beg = it + 1; //Устанавливаем отслеживатель за найденный элемент } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//C++ STL Листинг #2.5 find_if и лямбда-выражение #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {7, 88, 99, 111, 2222}; vector<int>::iterator it; //Итератор для сохранения результатов работы алгоритма vector<int>::iterator beg; //Итератор для отслеживания последней найденной позиции beg = v.begin(); //Устанавливаем отслеживатель позиции на начало вектора int left = 100; //Левая и правая границы диапазона int right = 200; it = find_if(beg, v.end(), [left, right](int value){ return value >= left && value <= right; }); if (it !=v.end()){ cout << "нашлось вхождение: " << *it << '\n'; //нашлось вхождение x, где [100 <= x <= 200] } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//C++ STL Листинг #2.6 find_if и функтор #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; struct MyFunctor{ const int left; const int right; int searching; MyFunctor(const int left_, const int right_):left(left_), right(right_){} bool operator()(int value){ //<-- В value приходит обходимый алгоритмом элемент searching = value; //<-- Запоминаем этот элемент в структуре return value >= left && value <= right; } }; int main(){ setlocale(LC_ALL, ""); vector<int> v = {7, 88, 99, 111, 2222}; vector<int>::iterator it; //Итератор для сохранения результатов работы алгоритма vector<int>::iterator beg; //Итератор для отслеживания последней найденной позиции MyFunctor mf(100, 200); //Будем искать элементы в диапазоне [100..200] it = find_if(v.begin(), v.end(), mf); if (it !=v.end()){ cout << "нашлось вхождение: " << *it << '\n'; //нашлось вхождение x, где [100 <= x <= 200] } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//C++ Листинг #3.1 search (поиск подстроки в строке) #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL #include <string> using namespace std; int main(){ setlocale(LC_ALL, ""); string S = "hello world, "; string text = "llo"; string::iterator it = search(S.begin(), S.end(), text.begin(), text.end()); if (it != S.end()){ cout << "Подстрока " << text << " в строке \"" << S << "\"найдена\n"; cout << "На позиции: " << it - S.begin() << '\n'; } else { cout << "Подстрока " << text << " в строке \"" << S << "\"не найдена\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//C++ STL Листинг #3.2 (search) и (массив []) #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL #include <string> using namespace std; int main(){ setlocale(LC_ALL, ""); const int N = 10; int arr[N] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; //массив, в котором ищем int match[] = {40, 50, 60}; //массив, какой ищем int* it = search(arr, arr + N, match, end(match)); //указатель в роли итератора if (it != (arr + N) ){ cout << "Подмассив match в arr обнаружен на позиции: " << it - arr << '\n'; } else { cout << "Подмассив match в arr не обнаружен\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//C++ STL Листинг #3.3 (search) и (vector) #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> arr = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}; //массив, в котором ищем vector<int> match = {40, 50, 60}; //массив, какой ищем vector<int>::iterator it = search(arr.begin(), arr.end(), match.begin(), match.end()); if (it != arr.end()){ cout << "последовательность match найдена в arr на позиции " << it - arr.begin() << '\n'; } else { cout << "последовательность match не найдена в arr\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//C++ STL Листинг #3.4 (search) и (отсутствие операции сравнения между искомыми элементами и элементами последовательности) #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; struct A{ int x; A(int x):x(x){} }; int main(){ setlocale(LC_ALL, ""); vector<int> match = {40, 60, 60}; //массив, какой ищем vector<A> v = {10, 20, 30, 40}; search(v.begin(), v.end(), match.begin(), match.end()); //<-- Ошибка в сравнении } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
//C++ STL Листинг #3.5 (search) и (вектор структур и вектор целых чисел) #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; struct A{ int x; A(int x):x(x){} }; bool pred(A x, int y){ //Первый параметр x имеет тип A, return x.x == y; //Сравниваем элемент структуры с числом из последовательности целых чисел } int main(){ setlocale(LC_ALL, ""); vector<int> match = {20, 30}; //массив, какой ищем vector<A> v = {10, 20, 30, 40}; vector<A>::iterator it = search(v.begin(), v.end(), match.begin(), match.end(), pred); /* ЭТО ДЛЯ КРАСОТЫ */ cout << "v ==> "; for (const auto &i: v){ cout << i.x << " "; } cout << '\n'; cout << "match ==> "; for (const auto &i: match){ cout << i << " "; } cout << '\n'; /* КОНЕЦ КРАСОТЫ */ if (it != v.end()){ cout << "Последовательность найдена\n"; } else { cout << "Последовательность не найдена\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//C++ STL Листинг #4.1 binary_search #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {77, 20, 88, 30}; //массив, какой ищем sort(v.begin(), v.end()); //алогритм сортировки for (const auto &i:v){ cout << i << ' '; } cout << '\n'; int number = 77; //искомое значение bool result = binary_search(v.begin(), v.end(), number); //Бинарный поиск возвращает булев тип if (result){ cout << number << " найдено\n"; } else{ cout << number << " не найдено\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//C++ STL Листинг #4.1 binary_search c предикатом #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; bool pred(int x, int y){ return x < y; // проверяем, что искомое значение больше какого-нибудь значения последовательности } int main(){ setlocale(LC_ALL, ""); vector<int> v = {77, 20, 88, 30, 99}; //массив, какой ищем sort(v.begin(), v.end()); //алгоритм сортировки for (const auto &i:v){ cout << i << ' '; } cout << '\n'; int number = 30; cout << "=====\n"; bool result = binary_search(v.begin(), v.end(), number, pred); //Бинарный поиск возвращает булев тип cout << "=====\n"; if (result){ cout << number << " найдено\n"; } else{ cout << number << " не найдено\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//C++ STL Листинг #5.1 lower_bound, upper_bound #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); //vector<int> v = {77, 20, 88, 30, 30, 30, 30, 99}; //массив, какой ищем vector<int> v = {0, 3, 3, 10}; sort(v.begin(), v.end()); //алгоритм сортировки for (const auto &i:v){ cout << i << ' '; } cout << '\n'; //////////////////////////////////////////////////////////////////////////////// int number = 3; cout << "number == " << number << "\n======================\n"; vector<int>::iterator result_low = lower_bound(v.begin(), v.end(), number); //low_bound возвращает итератор if ( result_low != v.end() ){ cout << " найдено: " << *result_low << '\n'; } else{ cout << number << " не найдено\n"; } //////////////////////////////////////////////////////////////////////////////// vector<int>::iterator result_up = upper_bound(v.begin(), v.end(), number); //Бинарный поиск возвращает булев тип if ( result_up != v.end() ){ cout << " найдено: " << *result_up << '\n'; } else{ cout << number << " не найдено\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
//C++ STL Листинг #5.2 low_bound, итератор на первое вхождение #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {0, 3, 3, 10}; sort(v.begin(), v.end()); //алгоритм сортировки for (const auto &i:v){ cout << i << ' '; } cout << '\n'; int number = 3; cout << "number == " << number << "\n======================\n"; vector<int>::iterator result_low = lower_bound(v.begin(), v.end(), number); //low_bound возвращает итератор if ( (result_low != v.end()) && (*result_low == number) ){ //<-- добавили проверку, что элемент есть в последовательности cout << " найдено: " << *result_low << " на позиции " << result_low - v.begin() << '\n'; } else{ cout << number << " не найдено\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
//C++ STL Листинг #5.3 equal_range #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {0, 3, 3, 10}; sort(v.begin(), v.end()); //алгоритм сортировки for (const auto &i:v){ cout << i << ' '; } cout << '\n'; int number = 3; cout << "number == " << number << "\n======================\n"; pair<vector<int>::iterator, vector<int>::iterator> result_bound = equal_range(v.begin(), v.end(), number); // if (result_bound.first != v.end()){ cout << "Получили выборку: "; for (vector<int>::iterator it = result_bound.first; it != result_bound.second; it++){ cout << *it << ' '; } } else { cout << "пусто\n"; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
//C++ STL Листинг #6.1 sort #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); vector<int> v = {0, 3, 3, 10}; sort(v.begin(), v.end()); //сортировка по возрастанию copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); //выводим вектор на экран cout << '\n'; sort(v.begin(), v.end(), greater<int>()); //сортировка по убыванию copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); //выводим вектор на экран cout << '\n'; sort(v.begin(), v.end(), less<int>()); //сортировка по возрастанию copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); //выводим вектор на экран cout << '\n'; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//C++ STL Листинг #6.2 sort #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; bool my_pred(int x, int y){ return x > y; //по убыванию //return x < y; //по возрастанию } int main(){ setlocale(LC_ALL, ""); vector<int> v = {0, 3, 3, 10}; sort(v.begin(), v.end(), my_pred); //сортировка по предикату copy(v.begin(),v.end(),ostream_iterator<int>(cout," ")); //выводим вектор на экран cout << '\n'; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//C++ STL Листинг #6.3 sort #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; bool my_pred(int x, int y){ return x > y; //по убыванию //return x < y; //по возрастанию } int main(){ setlocale(LC_ALL, ""); int arr[] = {56, 77, 99, 22}; sort(begin(arr), end(arr), my_pred); //сортировка по предикату copy(begin(arr), end(arr), ostream_iterator<int>(cout," ")); //выводим вектор на экран cout << '\n'; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//C++ STL Листинг #6.4 sort #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; bool my_pred(int x, int y){ return x > y; //по убыванию //return x < y; //по возрастанию } /*Из-за того, что от массива остался олько указатель, begin(arr) и end(arr) не сработают*/ void foo(int *arr, const int N){ sort(arr, arr+N, my_pred); //сортировка по предикату copy(arr, arr+N, ostream_iterator<int>(cout," ")); //выводим вектор на экран cout << '\n'; } int main(){ setlocale(LC_ALL, ""); int arr[] = {56, 77, 99, 22}; foo(arr, end(arr) - arr); //второй аргумент — это вычисление числа элементов в массиве } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//C++ STL Листинг #7.1 count #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL using namespace std; int main(){ setlocale(LC_ALL, ""); int arr[] = {56, 77, 99, 56, 22}; cout << count(begin(arr), end(arr), 56) << '\n'; //выводим на экран число вхождений 56 в массив arr vector<int> v = {99, 4, 55, 9, 55, 1, 99}; cout << count(v.begin(), v.end(), 55) << '\n'; //выводим на экран число вхождений 55 в вектор v } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//C++ STL Листинг #7.2 count_if Число гласных в строке #include <vector> #include <iostream> #include <algorithm> //будем использовать алгоритмы STL #include <cstring> //для strchr (поиск символа в С-строке) using namespace std; bool vowels(char ch){ const char alphabet[255] = "аояэеуёиыю"; ch = tolower(ch); //чтоб учитывались большие буквы, приводим их к маленьким return strchr(alphabet, ch); } int main(){ setlocale(LC_ALL, ""); string S = "ПривЕт"; cout << count_if(S.begin(), S.end(), vowels) << '\n'; //иЕ ==>2 S = "ПривЕт и как ты там?"; cout << count_if(S.begin(), S.end(), vowels) << '\n'; //иЕиаыа ==>6 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//C++ Листинг #8.1 Поиск максимального и минимального элементов #include <algorithm> #include <iostream> #include <vector> using namespace std; int main(){ int A[]={1,2,3,4,49,100,49}; vector<int> v(A,A+7); cout<<*max_element(v.begin(), v.end())<<endl; //Выводим тот индекс где максимальный элемент cout<<max_element(v.begin(),v.end())-v.begin()<<endl; //Выводим значение максимального элемента cout<<endl; cout<<*min_element(v.begin(),v.end())<<endl; //Выводим индекс где минимальный элемент cout<<min_element(v.begin(),v.end())-v.begin()<<endl; //Выводим значение минимального элемента } |
В Код C++ Алгоритм max_element и Алгоритм min_element небольшая ошибка: перепутани коментарии. Правильно будет так: