В данной статье мы познакомимся с некоторыми функциями из библиотеки algorithm. Само название данной библиотеки говорит нам о том, что в ней содержатся различные алгоритмы. Зачастую это такие, как поиск минимума/максимума, подсчет, разворот задом наперёд, то есть рутинные функции. Для того, чтобы не писать их каждый раз “руками”, и была создана данная библиотека. Далее мы рассмотрим 10 самых важных функций:

Далее мы будем использовать:

  • first - итератор начала
  • last - итератор конца
  • value - значение

count

count(first, last, value)

Возвращает количество элементов, равных value. Например, у нас имеется вектор, и мы хотим узнать, сколько в нём нулей:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
	vector<int> vec = { 1,0,1,0,1,1,1 };
	cout << count(vec.begin(), vec.end(), 0);
	return 0;
}

find

find(first, last, value)

Возвращает итератор на первый элемент, равный value. Например, у нас имеется массив константоной длины, и мы хотим найти 4:

#include <iostream>
#include <algorithm>

using namespace std;

const int SIZE = 10;

int main()
{
	int arr[SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	int *find_4 = find(arr, arr + SIZE, 4);
	cout << *find_4;
	return 0;
}

А что вернет find, если элемента со значением value нет? Будет возвращен указатель на last. В этом легко убедиться, если проанализировать следующий код:

int arr[SIZE] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int* find_100 = find(arr, arr + SIZE, 100);
cout << arr + SIZE << endl;
cout << find_100;

fill

fill(first, last, value)

Заполняет диапазон значениями value Здесь всё просто: заполним вектор нулями:

vector<int> vec(10);
fill(vec.begin(), vec.end(), 0);

reverse

reverse(first, last)

Разворачивает диапазон задом наперед. Допустим, у нас есть строка. И мы хотим проверить, является ли строка палиндромом:

string s, reversed;
cin >> reversed;
s = reversed;
reverse(reversed.begin(), reversed.end());
if (s == reversed)
	cout << "Palindrome!";
else
	cout << "Not palindrome :(";

swap

swap(a,b)

Обменивает a и b местами.

max/min

max(a,b) - берет максимум из двух чисел min(a,b) - берет минимум из двух чисел

Если нам нужно найти максимум/минимум из \(n\) чисел, то мы можем использовать следующее:

int a, b, c, d;
cin >> a >> b >> c >> d;
cout << "max: " << max(a, max(b, max(c, d))) << endl;
cout << "min: " << min(a, min(b, min(c, d)));

next_permutation/prev_permutation

next_permutation(first,last) - позволяет выполнить перестановку в диапазоне prev_permutation(first,last) - позволяет выполнить обратную перестановку в диапазоне

Пусть у нас имеется некоторая последовательность, для котрой мы хотим посмотреть все перестановки:

vector<int>vec;

sort(vec.begin(), vec.end());

do {
	for (auto x : vec)
		cout << x << " ";
	cout << endl;
} while (next_permutation(vec.begin(), vec.end()));

max_element/min_element

max_element(first,last) - возвращает итератор на максимальный элемент в массиве min_element(first,last) - возвращает итератор на минимальный элемент в массиве

vector<int>vec = { 1,2,3 };

cout << *max_element(vec.begin(), vec.end()) << endl;
cout << *min_element(vec.begin(), vec.end());

remove

remove(first, last, value)

Удаляет все элементы со значением value

rotate

rotate(first, n_first, last)

Зеркально отражает последовательность. В данном случае n_first - элемент будет первым в последовательности. Также можно рассматривать как сдвиг. Рассмотрим на примере строк:

string s = "abcd";
rotate(s.begin(), s.begin() + 2, s.end());
cout << s; // cdab