首页 > 解决方案 > 如何使用 count_if 计算向量中的可变数字范围

问题描述

我需要计算向量中出现的数字范围的频率

比如我想知道2、3、4在下面的向量vec中出现了多少次。

std::vector<int> vec = {0,3,1,3,2,4,0,1,3,4,2,3,4}; 

结果总和[i] = 8

如果它总是相同的范围,没问题:

sum[i] = std::count_if(vec.begin(), vec.begin(), [k](int i) { return i >=2 && i <=4; }); //lambda function works

但是我需要 for 循环中不同范围的 sum[i],例如 2,3,4,然后是 0,1,2,但这是行不通的。

int a = 0;
int b = 0;

// some computation
a = 2;
b = a+2;

sum[i] = std::count_if(vec.begin(), vec.begin(), [k](int i) { return i >=a && i <=b; }); //doesn't work as a and b are not constant.

有没有办法在 for 循环中将动态范围应用于 count_if ?

标签: c++

解决方案


lambda 的第一部分(您有k)定义了该 lambda “捕获”的内容,有效地将它们带入 lambda 的范围。所以你可以像这样定义你的 lambda:

[a,b](int i) { return i >= a && i < b; }

再多一点信息:这样做会复制 ab进入 lambda。如果您希望 lambda引用该变量,您可以添加一个&like [&a,&b]。这些可以混合。如果您不想明确列出所有内容,您可以让编译器自动检测使用的内容[=]并将它们复制到 lambda 中,或[&]在 lambda 中引用它们。


推荐阅读