📅  最后修改于: 2023-12-03 14:59:50.826000             🧑  作者: Mango
在 C++ 中,std::unary_negate()
是用于创建一元谓词的函数适配器。它可以用于将一个一元谓词转换为一个执行其逻辑取反的一元谓词。
std::unary_negate()
的函数原型如下所示:
template <class Predicate>
class unary_negate
{
public:
explicit unary_negate(const Predicate& pred);
bool operator() (const typename Predicate::argument_type& arg) const;
};
std::unary_negate()
接受一个一元谓词 Predicate
作为参数。
std::unary_negate()
返回一个函数对象 unary_negate
,其执行逻辑是对参数应用 Predicate
并取反。
下面是一个使用 std::unary_negate()
的示例:
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::vector<int> v2;
// 使用 std::copy_if() 和 std::not1() 移除偶数
std::copy_if(v.begin(), v.end(), std::back_inserter(v2), std::not1(std::ptr_fun<int, int>([](int i){ return i % 2 == 0; })));
// 使用 std::copy_if() 和 std::unary_negate() 移除偶数
std::copy_if(v.begin(), v.end(), std::back_inserter(v2), std::unary_negate<std::function<bool(int)>>(std::ptr_fun<int, int>([](int i){ return i % 2 == 0; })));
// 输出结果
for (auto i : v2)
{
std::cout << i << ' ';
}
std::cout << std::endl;
return 0;
}
在上面的示例中,我们使用 std::copy_if()
函数以及一个一元谓词的形式删除一个 vector 中的偶数。例如,我们可以使用 std::not1()
函数来将谓词取反以达到相同的目的,如下所示:
std::copy_if(v.begin(), v.end(), std::back_inserter(v2), std::not1(std::ptr_fun<int, int>([](int i){ return i % 2 == 0; })));
我们也可以使用 std::unary_negate()
函数适配器来实现相同的目的,如下所示:
std::copy_if(v.begin(), v.end(), std::back_inserter(v2), std::unary_negate<std::function<bool(int)>>(std::ptr_fun<int, int>([](int i){ return i % 2 == 0; })));
在上面的代码中,我们将要删除的偶数等价于一个谓词,它返回 true
如果一个数是偶数,否则返回 false
。我们使用 std::ptr_fun()
来将这个谓词转换为一个函数指针,然后将它传递给 std::not1()
或 std::unary_negate()
用于谓词逻辑取反。
最后,我们输出 vector 中所有的奇数。输出结果为:
1 3 5
这就是 std::unary_negate()
在 C++ 中的基本用法和示例。