📜  C++中的std :: unary_negate()与示例(1)

📅  最后修改于: 2023-12-03 14:59:50.826000             🧑  作者: Mango

C++ 中的 std::unary_negate()

在 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++ 中的基本用法和示例。