我的C++not1

本文介绍如何使用C++模板类my_unary_negate配合自定义函数对象mybind2nd,实现对Predicate类型的否定操作。通过实例展示了如何在sort和count_if中使用该技巧,简化代码并保持一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

template<typename Predicate>
class my_unary_negate : public unary_function<typename Predicate::argument_type,typename Predicate::result_type> {
protected:
    Predicate pred;
public:
    my_unary_negate(const Predicate &x) : pred(x) {}
    bool operator()(const typename Predicate::argument_type & x) {
        return !pred(x);
    }
};

template<typename Predicate>
inline my_unary_negate<Predicate>mynot1(const Predicate& pred) {
    return my_unary_negate<Predicate>(pred);
}

用起来:
配合我写的C++bind2nd

int main()
{
    vector<int>vt = {1,2,5,6,710,12,15};
    sort(vt.begin(),vt.end(),myless<int>());
    for(auto i : vt) cout<<i<<' ';
    cout<< count_if(vt.begin(),vt.end(),not1(mybind2nd(less<int>(),40)));
    //cout<< count_if(vt.begin(),vt.end(),mynot1(mybind2nd(less<int>(),40)));
    return 0;
}

结果跟原版一致。

### 关于C++中`if not`的用法及其替代方案 在C++编程语言中,逻辑表达式的书写方式非常灵活。虽然C++支持直接使用`if (not condition)`这样的语法来表示否定条件判断[^3],但在实际开发过程中,这种写法并不常见。这是因为传统的C++标准(如C++98/C++03)并未引入关键字`not`作为布尔运算符的一部分。直到C++11标准发布之后,才通过ISO/IEC 14882:2011正式加入了对`not`的支持。 然而,在许多项目中,为了保持向后兼容性和代码可读性,开发者更倾向于使用经典的`!`操作符代替`not`。因此,下面两种形式可以实现相同的功能: #### 使用经典`!`操作符的方式 这是最常见的做法之一,适用于几乎所有版本的C++编译器。 ```cpp if (!condition) { // 执行某些操作 } ``` #### 使用C++11中的`not`关键字 如果目标环境支持C++11及以上版本,则可以直接采用如下更为直观的形式: ```cpp if (not condition) { // 执行某些操作 } ``` 需要注意的是,尽管`not`提供了更好的语义化描述能力,但它本质上只是`!`的一个同义词而已,并不会带来额外性能优势或者功能扩展[^4]。 另外一种可能遇到的情况是嵌套多层逻辑时如何简化复杂度较高的条件句结构。此时可以通过定义辅助函数或将部分逻辑提取到独立变量当中去完成重构工作。例如给定这样一个原始版本的例子: ```cpp bool isValid = false; // 假设这里有一些计算过程... if (!(isValid && someOtherCondition)) { handleInvalidCase(); } else { proceedWithValidState(); } ``` 我们可以将其改造成更加清晰易懂的样子: ```cpp auto shouldHandleInvalid = [&](const bool validFlag)->bool{ return !(validFlag && someOtherCondition); }; if(shouldHandleInvalid(isValid)){ handleInvalidCase(); }else{ proceedWithValidState(); } ``` 以上方法不仅限定了作用域范围内的局部变更影响程度最小化原则同时也提高了整体程序维护成本效益比率[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值