您能解释一下这段代码是如何工作的吗?它成功计算了具有偶数值的 vector 元素,但我不清楚在这种特殊情况下绑定(bind)是如何工作的。
count_if(vec.begin(), vec.end(),
std::bind(logical_not<bool>(),
std::bind(modulus<int>(), placeholders::_1, 2)));
最佳答案
请注意,您发布的代码计算 vector 中的偶数数,不是奇数:
count_if(vec.begin(), vec.end(), bind(logical_not<bool>(), bind(modulus<int>(), placeholders::_1, 2)));
count_if
是一种返回指定范围内满足特定条件的元素数量的算法:
count_if(first, last, criteria)
在你的例子中,first
是vec.begin()
和 last
是vec.end()
: 所以整个 vector 都被考虑在内。
现在让我们把注意力集中在条件部分。
由内而外:
modulus<int>
是 function object返回整数除法的余数(就像 %
运算符)。它有两个参数:第一个表示为 placeholders::_1
,这是源 vector 中的通用元素。将其视为变量 x
扫描整个 vector 内容。
第二个参数是数字2
, 因为要检查一个整数是偶数还是奇数,你可以计算 x % 2
并将结果与 0 进行比较:
x % 2 == 0 --> even number
x % 2 == 1 --> odd number
bind
用于指定 modulus
的参数函数对象。
此模运算的结果作为另一个输入给出 function object : logical_not<bool>
.这只是否定输入,例如如果输入是 false
(0), logical_not<bool>
返回 true
, 反之亦然。
因此,“计数标准”由以下操作流程表示:
- 计算:
placeholders::_1 % 2
,即<<generic vector element>> % 2
, 使用modulus
. - 如果上述操作的结果是
0
(假),返回true
(反之亦然),使用logical_not
.
所以,如果一个数是偶数:
-
even number % 2 == 0
- 取反 0 得到
true
.
相反,如果数字是奇数:
-
odd number % 2 == 1
- 取反 1 你得到
false
.
自 count_if
计算条件为 true
的元素数,您正在计算 vector 中的偶数个数。
如果你真的想计算 vector 中的奇数,你可以去掉逻辑倒置(即logical_not
):
auto odds = count_if(vec.begin(), vec.end(),
bind(modulus<int>(), placeholders::_1, 2));
请注意,在这种情况下,函数式方法使用 modulus
和 logical_not
似乎太复杂了:使用 lambda(或者甚至 ad hoc IsEven()
simple function)会更清楚。
考虑以下代码 ( live here on Ideone ) 以比较三种方法:
#include <algorithm>
#include <functional>
#include <iostream>
#include <vector>
using namespace std;
bool IsEven(int n) {
return (n % 2) == 0;
}
int main() {
// Test vector
vector<int> vec{ 11, 22, 33, 44, 55 };
// Using functional approach
auto n = count_if(vec.begin(), vec.end(),
bind(logical_not<bool>(),
bind(modulus<int>(), placeholders::_1, 2)));
cout << n << endl;
// Using lambdas
n = count_if(vec.begin(), vec.end(),
[](int n) { return (n % 2) == 0; });
cout << n << endl;
// Using boolean returning ad hoc function
n = count_if(vec.begin(), vec.end(), IsEven);
cout << n << endl;
}
关于c++ - 查找具有偶数值的 vector 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23155162/