Урок №199. Алгоритмы STL

  Юрий  | 

  |

  Обновл. 26 Янв 2022  | 

 44834

 ǀ   6 

Помимо контейнеров и итераторов, библиотека STL также предоставляет ряд универсальных алгоритмов для работы с элементами контейнеров. Они позволяют выполнять такие операции, как поиск, сортировка, вставка, изменение позиции, удаление и копирование элементов контейнера.

Алгоритмы STL

Алгоритмы STL реализованы в виде глобальных функций, которые работают с использованием итераторов. Это означает, что каждый алгоритм нужно реализовать всего лишь один раз, и он будет работать со всеми контейнерами, которые предоставляют набор итераторов (включая и ваши собственные (пользовательские) контейнерные классы). Хотя это имеет огромный потенциал и предоставляет возможность быстро писать сложный код, у алгоритмов также есть и «тёмная сторона» — некоторая комбинация алгоритмов и типов контейнеров может не работать/работать с плохой производительностью/вызывать бесконечные циклы, поэтому следует быть осторожным.

Библиотека STL предоставляет довольно много алгоритмов. На этом уроке мы затронем лишь некоторые из наиболее распространенных и простых в использовании алгоритмов. Для их работы нужно подключить заголовочный файл algorithm.

Алгоритмы min_element() и max_element()


Алгоритмы min_element() и max_element() находят минимальный и максимальный элементы в контейнере:

Результат выполнения программы:

0 4

Алгоритмы find() и list::insert()

В следующем примере мы используем алгоритм find(), чтобы найти определенное значение в списке, а затем используем функцию list::insert() для добавления нового значения в список:

Результат выполнения программы:

0 1 7 2 3 4

Алгоритмы sort() и reverse()


В следующем примере мы отсортируем весь вектор, выведем отсортированные элементы, а затем выведем их в обратном порядке:

Результат выполнения программы:

-8 -3 3 4 5 8 12
12 8 5 4 3 -3 -8

Обратите внимание, общий алгоритм sort() не работает с вектором. У вектора есть свой собственный метод sort(), который, в данном случае, является более эффективным.

Заключение

Хотя это всего лишь небольшой пример алгоритмов, которые предоставляет STL, но этого уже должно быть достаточно, чтобы вы увидели пользу и то, насколько легко использовать алгоритмы STL в сочетании с итераторами и контейнерами.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (150 оценок, среднее: 4,93 из 5)
Загрузка...

Комментариев: 6

  1. somebox:

    Не пойму, почему в циклах, как край перебираемого диапазона, используется конструкция

    И еще не понятно это предложение: "Обратите внимание, общий алгоритм sort() не работает с вектором — у вектора есть свой собственный метод sort(), который, в данном случае, является более эффективным".

    Здесь же применили общий sort() и он дал результат -8 -3 3 4 5 8 12 — отсортировал от меньшего к большему. Или я чего-то не понял?

    1. Андрей:

      Итератор может указывать на любой элемент контейнера или на «пустой» элемент контейнера.
      Сделано это для того, например, что бы у контейнера с нулевым количеством элементов итератор имел смысл, т.е. указывал на «пустой» элемент.
      Таким образом функции end() контейнеров (и глобальная std::end() ) обычно возвращают элемент следующий ЗА последним элементом контейнера (пустой элемент). А значит последовательно перебирая итераторы унарным оператором ++, мы можем точно так же достигнуть этого пустого элемента и тем самым понять, что мы достигли конца контейнера.
      Поскольку у итераторов имеет смысл операция сравнения (итераторы понимают на что указывают и можно понять, указывают они на одно и тоже или нет), то условием окончания цикла устанавливают проверку, указывает ли наш итератор на последний элемент контейнера.

    2. Vadym:

      Замените слово "vector" на слово "list" и все будет правильно. В тексте действительно опечатка.

  2. dshadov:

    Добрый день!
    С итераторами удобнее использовать auto:

    и так:

    и даже так:

    И еще, метода sort() у вектора нет, зато есть у list. Например, во втором примере можно было отсортировать список так:

    1. Арбузик❤❤❤:

      Неплохо

Добавить комментарий для somebox Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *