std::includes работает неправильно

136
22 июня 2019, 08:50

Почему программа выводит 0? В описании функции сказано Returns true if the sorted range [first1,last1) contains all the elements in the sorted range [first2,last2).http://www.cplusplus.com/reference/algorithm/includes/. Но a содержит все элементы из b (1 и 2)

std::vector a{1, 2};
std::vector b{1, 2, 1, 2};
std::cout << std::includes(a.begin(), a.end(), b.begin(), b.end());
Answer 1
std::vector<int> a{1, 2}; // тут вы забыли аргумент шаблона
std::vector<int> b{1, 2, 1, 2};

Поменяйте местами обьекты, и все заработает

std::swap(a, b);
std::cout << std::includes(a.begin(), a.end(), b.begin(), b.end());

если b является подмножеством a, то получите положительный результат

Answer 2

Здесь по сути проверяется, входит ли диапазон полностью в другой диапазон, а не вычисляется разность множеств. Поэтому одинаковые элементы вполне допустимы (как в мультимножестве), и диапазона a явно не хватает для включения диапазона b.

А вот наоборот - вполне: проверьте сами

std::cout << std::includes(b.begin(), b.end(), a.begin(), a.end());

но не забудьте отсортировать :)

Другими словами, a является подмножеством b, но b не является подмножеством a - хотя бы потому, что в нем больше элементов :)

READ ALSO
Поведение и работа алгоритма std::includes

Поведение и работа алгоритма std::includes

Недавно вопрос прозвучал про этот алгоритмПо стандарту он принимает отсортированные последовательности, но у меня всегда выдавал правильный...

116
Проверка введенного пароля на символы А-Я, а-я, . , % *

Проверка введенного пароля на символы А-Я, а-я, . , % *

У меня есть обычная консольная форма регистрации:

100