📜  带有示例的C++ STL中的not1和not2函数模板(1)

📅  最后修改于: 2023-12-03 15:39:26.544000             🧑  作者: Mango

C++ STL中的not1和not2函数模板

在C++ STL中, not1not2 是两个非常有用的函数模板,它们可以对一个或两个谓词进行取反操作。这对于某些算法非常有用,例如 remove_if,可以使用 not1 来指定将所有不符合条件的元素移动到容器的末尾。

not1函数模板

not1 函数模板指定将一个谓词(即返回一个布尔值的函数对象)进行取反操作。其定义如下:

template <typename Predicate>
class unary_negate
{
public:
  unary_negate(const Predicate& pred) : pred(pred) {}
  bool operator()(const typename Predicate::argument_type& arg) const
  { return !pred(arg); }
private:
  Predicate pred;
};

template <typename Predicate>
unary_negate<Predicate> not1(const Predicate& pred)
{
  return unary_negate<Predicate>(pred);
}

其中,unary_negate 是用来实现对谓词进行取反操作的辅助类,not1 则是对该类的封装。

以下是一个使用 not1 函数来移除所有小于5的元素的例子:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
  std::vector<int> v{1,2,3,4,5,6,7,8,9};
  v.erase(std::remove_if(v.begin(), v.end(), std::not1([](int i){return i>=5;})), v.end());
  for (int i: v) {
    std::cout << i << ' ';
  }
  // output: 5 6 7 8 9
}
not2函数模板

not2 函数模板也是用于取反谓词,但它接受两个参数,并为二元谓词进行取反操作。其定义如下:

template <typename Predicate>
class binary_negate {
public:
  binary_negate(const Predicate& pred) : pred(pred) {}
  bool operator()(const typename Predicate::first_argument_type& x,
                  const typename Predicate::second_argument_type& y) const
  { return !pred(x, y); }
private:
  Predicate pred;
};

template <typename Predicate>
binary_negate<Predicate> not2(const Predicate& pred)
{
  return binary_negate<Predicate>(pred);
}

以下是一个使用 not2 函数来对有序容器进行搜索的例子:

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
  std::vector<int> v{1,2,3,4,5,6,7,8,9};
  int x = 3;
  auto it = std::find_if(v.begin(), v.end(), std::not2(std::less<int>()));
  
  if (it != v.end()) {
    std::cout << "First element greater than or equal to " << x << ": " << *it << '\n';
  } else {
    std::cout << "No element greater than or equal to " << x << '\n';
  }
  // output: First element greater than or equal to 3: 3
}

在这个例子中,我们使用 not2 函数和 std::less<int> 调用了 find_if 算法,以查找第一个大于等于某个值的元素。 std::less<int> 是一个二元谓词,用于比较两个元素的大小,我们通过 not2 对其进行取反操作,以实现查找一个大于等于某个值的元素。