2015-02-25 2 views
2

Я запускаю простой STL-алгоритм для подсчета количества элементов меньше 50. Эта программа генерирует ошибку «Тип объекта« int »не является указателем функции или функции». Я провел ночь, чтобы устранить эту проблему, и поиск аналогичного вопроса о stackoverflow без успеха, но в этот час я ничего не получаю. Я был бы признателен, если бы кто-нибудь мог указать на мою ошибку.Ошибка компилятора C++ в алгоритме count_if

#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

есть много проблем с кодом. начните с чего-то более простого, например, для отображения элементов в векторе. –

ответ

4

Вы должны пройти саму функцию предиката к count_if, а не результат вызова:

std::count_if(v1.begin(), v1.end(), lessThan); 
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'; 
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>. Например

#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)); 

Или вы могли бы использовать лямбда-выражение

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; });