「这是我参与11月更文挑战的第 8 天,活动详情查看:2021最后一次更文挑战」。
参加该活动的第 16 篇文章
参考原文地址:C++11 新增的一些便利的算法
我对文章的格式和错别字进行了调整,并补充标注出了重要的部分,根据我自己的理解把重点部分进一步解释完善(原作者的代码注释甚少,有的地方甚至有错误)。以下是正文
正文
C++11 新增加了一些便利的算法 —— 比如三个用于判断的算法 all_of
、any_of
和 one_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;
}
输出结果为
(完)