Namespaces
Variants

std:: not2

From cppreference.net
Utilities library
Function objects
Function invocation
(C++17) (C++23)
Identity function object
(C++20)
Old binders and adaptors
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
not2
( until C++20* )
( until C++17* ) ( until C++17* )
( until C++17* ) ( until C++17* )

( until C++17* )
( until C++17* ) ( until C++17* ) ( until C++17* ) ( until C++17* )
( until C++20* )
( until C++20* )
Определено в заголовочном файле <functional>
template < class Predicate >
std:: binary_negate < Predicate > not2 ( const Predicate & pred ) ;
(до C++14)
template < class Predicate >
constexpr std:: binary_negate < Predicate > not2 ( const Predicate & pred ) ;
(начиная с C++14)
(устарело в C++17)
(удалено в C++20)

std::not2 — это вспомогательная функция для создания функционального объекта, возвращающего дополнение переданной бинарной предикатной функции. Создаваемый функциональный объект имеет тип std:: binary_negate < Predicate > .

Бинарный тип предиката должен определять два типа-члена, first_argument_type и second_argument_type , которые могут быть преобразованы в типы параметров предиката. Функциональные объекты, полученные из std::owner_less , std::ref , std::cref , std::plus , std::minus , std::multiplies , std::divides , std::modulus , std::equal_to , std::not_equal_to , std::greater , std::less , std::greater_equal , std::less_equal , std::logical_not , std::logical_or , std::bit_and , std::bit_or , std::bit_xor , std::mem_fn , std::map::value_comp , std::multimap::value_comp , std::function , или из другого вызова std::not2 , имеют эти типы определенными, как и функциональные объекты, унаследованные от устаревшего std::binary_function .

Содержание

Параметры

pred - бинарный предикат

Возвращаемое значение

std::not2 возвращает объект типа std:: binary_negate < Predicate > , созданный с помощью pred .

Исключения

(нет)

Пример

#include <algorithm>
#include <cstddef>
#include <functional>
#include <iostream>
#include <vector>
struct old_same : std::binary_function<int, int, bool>
{
    bool operator()(int a, int b) const { return a == b; }
};
struct new_same
{
    bool operator()(int a, int b) const { return a == b; }
};
bool same_fn(int a, int b)
{
    return a == b;
}
int main()
{
    std::vector<int> v1{0, 1, 2};
    std::vector<int> v2{2, 1, 0};
    std::vector<bool> v3(v1.size());
    std::cout << "отрицание бинарной функции:\n";
    std::transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),
                   std::not2(old_same()));
    std::cout << std::boolalpha;
    for (std::size_t i = 0; i < v1.size(); ++i)
        std::cout << v1[i] << ' ' << v2[i] << ' ' << v3[i] << '\n';
    std::cout << "негация стандартного функтора:\n";
    std::transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),
                   std::not2(std::equal_to<int>()));
    for (std::size_t i = 0; i < v1.size(); ++i)
        std::cout << v1[i] << ' ' << v2[i] << ' ' << v3[i] << '\n';
    std::cout << "негация std::function:\n";
    std::transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),
                   std::not2(std::function<bool(int, int)>(new_same())));
    for (std::size_t i = 0; i < v1.size(); ++i)
        std::cout << v1[i] << ' ' << v2[i] << ' ' << v3[i] << '\n';
    std::cout << "негация std::reference_wrapper:\n";
    std::transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),
                   std::not2(std::ref(same_fn)));
    for (std::size_t i = 0; i < v1.size(); ++i)
        std::cout << v1[i] << ' ' << v2[i] << ' ' << v3[i] << '\n';
}

Вывод:

инвертирование binary_function:
0 2 true
1 1 false
2 0 true
инвертирование стандартного функтора:
0 2 true
1 1 false
2 0 true
инвертирование std::function:
0 2 true
1 1 false
2 0 true
инвертирование std::reference_wrapper:
0 2 true
1 1 false
2 0 true

Смотрите также

(C++17)
создает функциональный объект, возвращающий дополнение результата содержащегося в нем функционального объекта
(шаблон функции)
(устарело в C++17) (удалено в C++20)
оберточный функциональный объект, возвращающий дополнение бинарного предиката, который он содержит
(шаблон класса)
(C++11)
копируемая обертка любого копируемого вызываемого объекта
(шаблон класса)
перемещаемая обертка любого вызываемого объекта, поддерживающего квалификаторы в заданной сигнатуре вызова
(шаблон класса)
(устарело в C++17) (удалено в C++20)
создает пользовательский объект std::unary_negate
(шаблон функции)
(устарело в C++11) (удалено в C++17)
создает обертку функционального объекта, совместимую с адаптерами, из указателя на функцию
(шаблон функции)
(устарело в C++11) (удалено в C++17)
базовый класс бинарной функции, совместимый с адаптерами
(шаблон класса)