Прежде чем читать мою статью - реши для себя, зачем ты это делаешь. Даже если ты просто нормальный человек, лишним не будет.
Если вы настоящий профессионал программирования, то зачем вы тут сидите и читайте статью на пикабу? Если вы ради интереса зашли почитать, то претензий ноль, но если вы просто захотели задушить нового пользователя Пикабу минусами, то немедленно покиньте статью, вам однозначно интересно не будет.
Алгоритмы — это готовые функции, которые помогают выполнять типичные задачи с последовательностями элементов, такими как:
Эти алгоритмы работают с итераторами , которые представляют собой указатели на элементы контейнера (например, vector, list, deque и т.д.).
2. Как работают итераторы?
Итераторы — это объекты, которые позволяют перебирать элементы контейнера. Они похожи на указатели, но могут быть адаптированы для разных типов контейнеров.
Основные правила работы с итераторами:
Два итератора задают диапазон :
Первый итератор указывает на начало диапазона.
Второй итератор указывает за последний элемент диапазона (так называемый "полуинтервал").
Например: [first, last) означает, что first включается, а last исключается.
Итераторы одного контейнера :
Операции с итераторами :
Можно двигаться вперед с помощью оператора ++.
Можно сравнивать итераторы (iter1 == iter2 или iter1 != iter2).
Можно разыменовывать итераторы (*iter) для доступа к значению.
3. Примеры работы с алгоритмами
Функция std::count подсчитывает, сколько раз встречается определенное значение в последовательности.
std::vector<int> v = {2, 7, 1, 8, 2, 8};
int count = std::count(v.begin(), v.end(), 8); // Сколько раз встречается число 8
std::cout << "Число 8 встречается " << count << " раз(а).\n";
Алгоритм проходит по всем элементам в диапазоне [v.begin(), v.end()).
Если элемент равен заданному значению (в данном случае 8), счетчик увеличивается.
Функция std::find ищет первый элемент, равный заданному значению.
std::deque<int> d = {3, 14, 15, 92, 6};
auto it = std::find(d.begin(), d.end(), 15); // Ищем число 15
std::cout << "Найдено число: " << *it << "\n";
std::cout << "Число не найдено.\n";
Алгоритм проходит по всем элементам в диапазоне [d.begin(), d.end()).
Если элемент найден, возвращается итератор на него.
Если элемент не найден, возвращается d.end().
Функция std::sort сортирует элементы в порядке возрастания.
std::vector<int> data = {100, 42, 17, 80, 20, 0};
std::sort(data.begin(), data.end()); // Сортируем все элементы
std::cout << x << " "; // 0 17 20 42 80 100
Алгоритм использует быструю сортировку (quicksort) или другую эффективную стратегию.
Элементы переставляются так, чтобы они шли в порядке возрастания.
4. Алгоритмы с предикатами
Предикат — это функция, которая возвращает true или false. Алгоритмы с суффиксом _if используют предикаты для выполнения условий.
Подсчитаем, сколько заглавных букв в строке.
std::string s = "iPhone SE";
int count = std::count_if(s.begin(), s.end(), [](char c) {
return ('A' <= c && c <= 'Z'); // Проверяем, является ли символ заглавной буквой
std::cout << "Заглавных букв: " << count << "\n"; // 3
Лямбда-функция проверяет, является ли символ заглавной буквой.
Алгоритм применяет эту функцию ко всем элементам строки.
5. Модификация последовательности
Алгоритмы могут изменять порядок или значения элементов.
Переворачивает порядок элементов.
std::string s = "No lemon, no melon!";
std::reverse(s.begin(), s.end()); // Переворачиваем строку
std::cout << s << "\n"; // !nolem on ,nomel oN
6. Копирование данных
Функция std::copy копирует элементы из одной последовательности в другую.
std::vector<int> v = {3, 14, 15, 92, 6};
std::list<int> l(v.size()); // Создаем список того же размера
std::copy(v.begin(), v.end(), l.begin()); // Копируем данные
std::cout << x << " "; // 3 14 15 92 6
7. Теоретико-множественные операции
Если последовательности отсортированы, можно выполнять операции над множествами.
Объединяет два множества.
std::vector<int> a = {1, 3, 5, 7};
std::vector<int> b = {2, 3, 6};
std::set_union(a.begin(), a.end(), b.begin(), b.end(), std::back_inserter(result));
std::cout << x << " "; // 1 2 3 5 6 7
8. Бинарный поиск
Для отсортированных последовательностей можно использовать бинарный поиск.
Пример: std::binary_search
Проверяет, есть ли элемент в последовательности.
std::vector<int> data = {1, 4, 5, 9, 9, 13, 47};
bool found = std::binary_search(data.begin(), data.end(), 5); // Ищем число 5
std::cout << (found ? "Найдено" : "Не найдено") << "\n";
Заключение
Алгоритмы стандартной библиотеки C++ — это мощный инструмент для работы с данными. Они универсальны, эффективны и легко интегрируются в код. Чтобы использовать их правильно:
Убедитесь, что вы понимаете, как работают итераторы.
Выбирайте подходящий алгоритм для вашей задачи.
Используйте предикаты для сложных условий.
Теперь вы знаете основы работы с алгоритмами и можете применять их в своих программах!
Вот несколько задач для закрепления материала по алгоритмам C++:
Напишите программу, которая считает количество четных чисел в векторе
Найдите первое отрицательное число в списке или выведите сообщение, что их нет
Сортировка:
Посчитайте количество гласных букв в строке
Найдите первое слово в векторе строк, начинающееся на заданную букву
Модификация последовательностей:
Скопируйте только положительные числа из одного вектора в другой
Создайте копию строки, преобразовав все буквы в верхний регистр
Теоретико-множественные операции:
Проверьте, содержит ли отсортированный массив заданное число
Найдите первое число, большее заданного, в отсортированном векторе
Комбинированные задачи:
Отсортируйте список слов и подсчитайте количество уникальных
Найдите все числа в диапазоне [a, b] в отсортированном массиве
Удалите все четные числа из вектора и отсортируйте оставшиеся
Работа с пользовательским вводом:
Запросите у пользователя набор чисел, отсортируйте их и найдите медиану
Создайте телефонный справочник (вектор пар имя-телефон) и реализуйте поиск по имени
Обработка текста:
Посчитайте частоту встречаемости каждой буквы в тексте
Разбейте текст на слова и выведите только те, что длиннее 5 символов