c++ - 查找具有偶数值的 vector 元素

标签 c++ algorithm stl bind

您能解释一下这段代码是如何工作的吗?它成功计算了具有偶数值的 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)

在你的例子中,firstvec.begin()lastvec.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 , 反之亦然。

因此,“计数标准”由以下操作流程表示:

  1. 计算:placeholders::_1 % 2 ,即 <<generic vector element>> % 2 , 使用 modulus .
  2. 如果上述操作的结果是0 (假),返回 true (反之亦然),使用 logical_not .

所以,如果一个数是偶数:

  1. even number % 2 == 0
  2. 取反 0 得到 true .

相反,如果数字是奇数:

  1. odd number % 2 == 1
  2. 取反 1 你得到 false .

count_if计算条件为 true 的元素数,您正在计算 vector 中的偶数个数。

如果你真的想计算 vector 中的奇数,你可以去掉逻辑倒置(即logical_not):

auto odds = count_if(vec.begin(), vec.end(),
                     bind(modulus<int>(), placeholders::_1, 2));    

请注意,在这种情况下,函数式方法使用 moduluslogical_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/

相关文章:

algorithm - 这段代码的复杂性是什么,它的嵌套 for 循环重复地使它的计数器加倍?

c++ - 为什么不能 map::find 指向 const 的指针?

python - 获得反向排序的快速排序(降序)

c++ - 如何使队列上的推送和弹出成为原子操作,如何锁定这些操作?

c++ - 编写 std::vector 与普通数组的线程安全

c++ - 内存分配错误,可能在 GDB 中

c++ - 是否可以在 multimap 中使用自定义查找功能?

c++ - 无法解析符号哈希

c++ - 两个构造函数,哪个是默认的?

从浮雕/浮雕图像中获取近似深度图的算法