我正在运行一个简单的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;
}
答案 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; } );