std::not2(3)
π NAME π
std::not2 β literally std::not2, that's the whole name bestie π
β¨ SYNOPSIS β¨
Defined in header <functional> π¦
template< class Predicate > (until C++14)
std::binary_negate<Predicate> not2( const Predicate& pred );
template< class Predicate > (since C++14)
constexpr std::binary_negate<Predicate> not2( const Predicate& pred );
(deprecated in C++17)
(removed in C++20)
πΈ DESCRIPTION πΈ
okay so picture this: std::not2 is a little helper function whose entire personality is creating a function object that returns the complement of the binary predicate function you hand it. Like, it flips your trues to falses and your falses to trues. The function object it creates is of type std::binary_negate<Predicate>. periodt π
Here's the catch though, and it's kind of a big one β your binary predicate type must define two member types, first_argument_type and second_argument_type, and those have to be convertible to the predicate's parameter types. No exceptions, that's the vibe check π
The function objects you get from all of these lovely things have those types defined for you already:
std::owner_lessstd::refstd::crefstd::plusstd::minusstd::multipliesstd::dividesstd::modulusstd::equal_tostd::not_equal_tostd::greaterstd::lessstd::greater_equalstd::less_equalstd::logical_notstd::logical_orstd::bit_andstd::bit_orstd::bit_xorstd::mem_fnstd::map::value_compstd::multimap::value_compstd::function
β¦or from another call to std::not2, obviously. Same goes for function objects derived from the deprecated std::binary_function β they've got these types too π«Ά
π¦ PARAMETERS π¦
predβ a binary predicate. that's it. that's the parameter π
β RETURN VALUE β
std::not2 returns an object of type std::binary_negate<Predicate>, constructed with pred. iconic behavior, no notes π
π EXCEPTIONS π
(none) β literally none, we love a low-drama function π
π₯ EXAMPLE π₯
Run this code, bestie, I promise it slaps:
#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 << "negating a binary_function:\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 << "negating a standard functor:\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 << "negating a 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 << "negating a 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';
}
π Output
negating a binary_function:
0 2 true
1 1 false
2 0 true
negating a standard functor:
0 2 true
1 1 false
2 0 true
negating a std::function:
0 2 true
1 1 false
2 0 true
negating a std::reference_wrapper:
0 2 true
1 1 false
2 0 true
look at that consistency, she ate and left no crumbs πβ¨
π SEE ALSO π
not_fn(C++17) β creates a function object that returns the complement of the result of the function object it holds (function template)binary_negate(deprecated in C++17) (removed in C++20) β wrapper function object returning the complement of the binary predicate it holds (class template)function(C++11) β wraps callable object of any copy constructible type with specified function call signature (class template)move_only_function(C++23) β wraps callable object of any type with specified function call signature (class template)not1(deprecated in C++17) (removed in C++20) β constructs customstd::unary_negateobject (function template)ptr_fun(deprecated in C++11) (removed in C++17) β creates an adaptor-compatible function object wrapper from a pointer to function (function template)binary_function(deprecated in C++11) (removed in C++17) β adaptor-compatible binary function base class (class template)
β οΈ heads up babe:std::not2is deprecated in C++17 and straight up removed in C++20. if you're on a modern compiler, please don't come crying to me β go look atnot_fninstead π
okay that's the whole page, mwah π this masterpiece came from http://cppreference.com, dated 2024.06.10, and it's filed under std::not2(3) β go forth and negate responsibly π§ββοΈπΈ
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms