📅  最后修改于: 2023-12-03 15:39:26.544000             🧑  作者: Mango
在C++ STL中, not1
和 not2
是两个非常有用的函数模板,它们可以对一个或两个谓词进行取反操作。这对于某些算法非常有用,例如 remove_if
,可以使用 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
函数模板也是用于取反谓词,但它接受两个参数,并为二元谓词进行取反操作。其定义如下:
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
对其进行取反操作,以实现查找一个大于等于某个值的元素。