C++11 新增的判断算法

191 阅读1分钟

「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战」。

参加该活动的第 16 篇文章

参考原文地址:C++11 新增的一些便利的算法

我对文章的格式和错别字进行了调整,并补充标注出了重要的部分,根据我自己的理解把重点部分进一步解释完善(原作者的代码注释甚少,有的地方甚至有错误)。以下是正文

正文

C++11 新增加了一些便利的算法 —— 比如三个用于判断的算法 all_ofany_ofone_of ,使我们的代码写起来更简洁方便,更多的新增算法读者可以参考 en.cppreference.com/w/cpp/algor…

对应的定义如下

template <class InputIt, class UnaryPredicate>
bool all_of(InputIt first, InputIt last, UnaryPredicate p);

template <class InputIt, class UnaryPredicate>
bool any_of(InputIt first, InputIt last, UnaryPredicate p);

template <class InputIt, class UnaryPredicate>
bool none_of(InputIt first, InputIt last, UnaryPredicate p);
  • all_of: 检查区间 [first, last) 中是否所有的元素都满足一元判断式 p,所有的元素都满足条件返回 true ,否则返回 false
  • any_of:检查区间 [first, last) 中是否至少有一个元素都满足一元判断式 p,只要有一个元素满足条件就返回 true,否则返回 true
  • none_of:检查区间 [first, last) 中是否所有的元素都不满足一元判断式 p,所有的元素都不满足条件返回 true,否则返回 false

下面是这几个算法的示例【原作者的代码有误】:

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

using namespace std;

int main() {
    vector<int> v = { 1, 3, 5, 7, 9 };

    auto isOdd = [](int i) {
            return i % 2 != 0;
    };

    auto isEven = [](int i) {
        return i % 2 == 0;
    };
    
    /// @note 所有都是奇数才返回 true
    bool isallOdd = std::all_of(v.begin(), v.end(), isOdd);
    if (isallOdd)
        cout << "all is odd" << endl;
    
    /// @note 没有一个是偶数才返回 true
    bool isNoneEven = std::none_of(v.begin(), v.end(), isEven);
    if (isNoneEven)
        cout << "none is even" << endl;
    
    /// @note 至少有一个是偶数才返回 true
    vector<int> v1 = { 1, 3, 5, 7, 8, 9 };
    bool anyof = std::any_of(v1.begin(), v1.end(), isEven);
    if (anyof)
        cout << "at least one is even" << endl;
}

输出结果为

image.png

(完)