count_if算法中的C ++编译器错误

时间:2015-02-25 08:40:07

标签: c++ countif

我正在运行一个简单的STL算法来计算小于50的元素数。该程序生成错误“被称为对象类型'int'不是函数或函数指针”。我花了一整夜的时间来排除故障,并在stackoverflow上寻找类似的问题而没有成功,但是在这个时候我无处可去。如果有人能指出我的错误,我将不胜感激。

#include <iostream>
#include <numeric>
#include <functional>
#include <algorithm>
#include <vector>
#include <cstdlib>

using namespace std;

bool lessThan(double x)    //global function
{
    return (x < 50);
}

int main()
{
    vector<double> v1(5);    //create vector of 5 doubles
    for (auto i : v1) {    //for each element in v1...(auto used to determine type)
        v1[i] = rand() % 100;    //generate random numbers
        cout << v1[i] << endl;
        count_if(v1.begin(), v1.end(), lessThan(v1[i]));
    }

    return 0;
}  

3 个答案:

答案 0 :(得分:5)

你有两个问题:第一个关于你的错误是因为你调用函数,但是你应该只提供一个指向函数的指针。

第二个问题难以诊断,但range-for statement为您提供了容器的,而不是索引。这意味着i将是double值,您将获得其中五个值,每个值都为0.0

要解决最后一个问题,我建议你做一些这样的事情

for (auto& v : v1)
{
    v = some_value;
}

std::cout << "Number of items whose value is less than 50: "
          << std::count_if(std::begin(v1), std::end(v1), lessThan)
          << '\n';

答案 1 :(得分:4)

您必须将谓词函数本身传递给count_if,而不是调用的结果:

std::count_if(v1.begin(), v1.end(), lessThan);

答案 2 :(得分:3)

我认为你的意思是以下

for (auto i : v1) {    //for each element in v1...(auto used to determine type)
    v1[i] = rand() % 100;    //generate random numbers
    cout << v1[i] << endl;
}

auto num = count_if(v1.begin(), v1.end(), lessThan );

此外,您可以使用标头<functional>中声明的标准功能对象std :: less。例如

#include <functional>
//...

for (auto i : v1) {    //for each element in v1...(auto used to determine type)
    v1[i] = rand() % 100;    //generate random numbers
    cout << v1[i] << endl;
}

auto num = count_if(v1.begin(), v1.end(), std::bind2nd( std::less<double>(), 50.0 ) );

或者您可以使用lambda表达式

for (auto i : v1) {    //for each element in v1...(auto used to determine type)
    v1[i] = rand() % 100;    //generate random numbers
    cout << v1[i] << endl;
}

auto num = count_if(v1.begin(), v1.end(), []( double x ) { return x < 50.0; } );