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

  Юрий  | 

  Обновл. 2 Июл 2019  | 

 6202

 ǀ   4 

Помимо контейнеров и итераторов, 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 (35 оценок, среднее: 5,00 из 5)
Загрузка...

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

  1. Аватар somebox:

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

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

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

    1. Аватар Андрей:

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

  2. Аватар dshadov:

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

    и так:

    и даже так:

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

Добавить комментарий

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