c++ - 如何使用 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 ?
解决方案
lambda 的第一部分(您有k
)定义了该 lambda “捕获”的内容,有效地将它们带入 lambda 的范围。所以你可以像这样定义你的 lambda:
[a,b](int i) { return i >= a && i < b; }
再多一点信息:这样做会复制 a
并b
进入 lambda。如果您希望 lambda引用该变量,您可以添加一个&
like [&a,&b]
。这些可以混合。如果您不想明确列出所有内容,您可以让编译器自动检测使用的内容[=]
并将它们复制到 lambda 中,或[&]
在 lambda 中引用它们。
推荐阅读
- database - 哪个更有效 smallint 或 character(10)?
- angular - 当 Angular 6 中的 ngModel 为空时,如何在输入中输入 0
- ansible - 如何从 ansible playbook 确定命令行选项
- vulkan - Vulkan:在多帧缓冲区的情况下,我应该为每个着色器统一创建多个 VkBuffers 吗?
- ruby-on-rails - ActionController::InvalidAuthenticityToken 时如何测试重定向
- scala - 如何访问 replaceAllIn() 计数器?
- python - 神经网络根本没有训练
- apache - 使用带有 Xampp 的 Windows 2016 服务器托管多个网站
- keras - 为什么 Keras 的 MSE 与我计算的不一样?
- python - read_gbq 函数中 REGEXP_EXTRACT 中的正则表达式失败