Готовый перевод Five new algorithms to C++11 that you should know about / Пять новых алгоритмов в C++11, о которых вы должны знать: 1

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

C++11 добавил несколько несколько общих алгоритмов в заголовочный файл <algorithm>. В этой статье мы рассмотрим пять из них, о которых
разработчики должны знать.

all_of,any_of и none_of

Вообще, это три схожих алгоритма: all_of, any_of, none_of. Они проверяют возвращает ли унарный предикат истину для всех,
любого или никакого элемента в диапазоне.

Несколько примеров:

int numbers[] = {1, 2, 42, 7, 0};
auto is_positive = [](int const n){return n >= 0;};
std::cout << std::boolalpha
<< std::all_of(std::begin(numbers), std::end(numbers), is_positive)
<< std::endl;
auto is_zero = [](int const n) {return n == 0;};
std::cout << std::boolalpha
<< std::any_of(std::begin(numbers), std::end(numbers), is_zero)
<< std::endl;
std::vector<std::string> words = {"to", "be", "or", "not"};
auto is_empty = [](std::string const & s) {return s.empty();};
std::cout << std::boolalpha
<< std::none_of(std::begin(words), std::end(words), is_empty)
<< std::endl;

is_sorted и is_sorted_until

Первый алгоритм, is_sorted, проверяет отсортированы ли элементы
диапазона по возрастанию. Доступны две перегрузки функции, первая использует оператор <, а вторая принимает функцию сравнения (которая возвращает истину если первый элемент меньше второго) и использует их для сравнения элементов диапазона.

int numbers[] = {1, 2, 42, 7, 0};
std::cout << std::boolalpha
<< std::is_sorted(std::begin(numbers), std::end(numbers))
<< std::endl;
std::vector<std::string> words = {"to", "be", "or", "not"};
auto smaller_length = [](std::string const & first,
std::string const & second)
{
return first.length() < second.length();
};
std::cout << std::boolalpha
<< std::is_sorted(std::begin(words), std::end(words),
smaller_length)
<< std::endl;

Второй алгоритм, is_sorted_until, схож тем, что проверяет отсортированы
ли элементы диапазона по возрастанию. Однако функция возвращает не логическое значение, а итератор на верхнюю границу отсортированного поддиапазона (начиная с начала проверяемого диапазона), то есть следующего за последним отсортированным элементом. Доступны две перегрузки, первая использует оператор <, а вторая принимает функцию сравнения, как и is_sorted.

int numbers[] = {1, 2, 42, 7, 0};
auto last = std::is_sorted_until(std::begin(numbers), std::end(numbers));
std::cout << "upper bound = " << *(last-1) << std::endl;
std::cout << "sort size = " << std::distance(std::begin(numbers), last)
<< std::endl;

Вывод для примера:

upper bound = 42
sort size = 3

is_partitioned

Алгоритм is_partitioned проверяет разделены ли элементы диапазона, то
есть отсортированы ли в соответствии с тем, чтобы все элементы, удовлетворяющие передаваемому предикату шли перед всеми элементами, которые ему не удовлетворяют. Функция возвращает истину если диапазон пуст.

struct message
{
std::string text;
bool delivered;
};
std::vector<message> messages = {
{"first message", true},
{"second message", true},
{"third message", false},
{"fourth message", false},
{"fifth message", true},
};
auto is_delivered = [](message const & msg) {return msg.delivered;};
// не разделен
std::cout << std::boolalpha
<< std::is_partitioned(std::begin(messages), std::end(messages),
is_delivered)
<< std::endl;
// разделяем
std::partition(std::begin(messages), std::end(messages), is_delivered);
// проверяем разделение
std::cout << std::boolalpha
<< std::is_partitioned(std::begin(messages), std::end(messages),
is_delivered)
<< std::endl;

is_permutation

Алгоритм is_permutation определяет является ли диапазон перестановкой
другого диапазона. Доступны две перегрузки, первая использует оператор == для сравнения элементов двух диапазонов и вторая принимает бинарный предикат (который возвращает истину если элементы равны).

int numbers[] = {1, 2, 42, 7, 0};
int numbers2[] = {0, 1, 2, 7, 42};
std::cout << std::boolalpha
<< std::is_permutation(std::begin(numbers), std::end(numbers),
std::begin(numbers2))
<< std::endl;

minmax_element

Алгоритм minmax_element ищет минимальный и максимальный элементы
диапазона и возвращает пару итераторов на эти элементы. Важно отметить: если диапазон пуст, функция возвращает std::make_pair(first, first) если присутствует более одного элемента равного минимальному значению, она возвращает итератор на первый из этих элементов если присутствует более одного элемента равного максимальному значению, она возвращает итератор на последний из этих элементов.

Доступны две перегрузки, первая использует оператор < для сравнения элементов и вторая использует передаваемую функцию сравнения.

std::vector<int> numbers = {1, 2, 7, 42, 0};
std::vector<int>::iterator minimum, maximum;
std::tie(minimum, maximum) = std::minmax_element(std::begin(numbers),
std::end(numbers));
std::cout << "minimum = " << *minimum << std::endl;
std::cout << "maximum = " << *maximum << std::endl;

Вывод:

minimum = 0
maximum = 42

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/51493/217083

Переводчики: anatol1988

Настройки

Готово:

100.00% КП = 1.0