如何使用count_if计算向量中数字的可变范围

时间:2018-09-03 00:32:25

标签: c++

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

例如,我想知道下面的矢量vec中出现了2、3、4次。

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?

2 个答案:

答案 0 :(得分:1)

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

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

更多信息:像这样将复制 ab到lambda中。如果要让lambda 引用变量,则可以添加&之类的[&a,&b]。这些可以混合。如果您不想明确列出所有内容,则可以让编译器自动检测使用的内容,然后[=]将它们复制到lambda中,或者[&]在lambda中引用它们。

答案 1 :(得分:0)

我在您的代码中看到两个问题:

sum[i] = std::count_if(vec.begin(), vec.begin(), [k](int i) { return i >=a && i <=b; }); 

first中的lastcount_if迭代器都是vec.begin()last迭代器应为vec.end()

lambda函数的捕获表达式[]具有k。但是k根本没有被使用。在这种情况下,它不会引起任何问题。但是只能捕获其中要使用的内容。

如果要在lambda中使用ab的值,则需要在捕获表达式中捕获它们。 然后您的代码将变为:

std::count_if(vec.begin(), vec.end(), [a, b](int i) { return (i >= a && i <=b) ; });