2010-07-19 34 views
12

Tôi đang sử dụng hàm STL count_if để đếm tất cả các giá trị dương trong vectơ tăng gấp đôi. Ví dụ mã của tôi là một cái gì đó như:Các biến vị ngữ chuẩn cho STL count_if

vector<double> Array(1,1.0) 

Array.push_back(-1.0); 
Array.push_back(1.0); 

cout << count_if(Array.begin(), Array.end(), isPositive); 

nơi hàm isPositive được định nghĩa là

bool isPositive(double x) 
{ 
    return (x>0); 
} 

Các mã sau sẽ trở lại 2. Có cách nào làm ở trên mà không writting chức năng của riêng tôi tích cực? Có chức năng tích hợp chức năng tôi có thể sử dụng không?

Cảm ơn!

+0

Dưới đây là một danh sách: http://msdn.microsoft.com/en-us /library/4y7z5x4b(v=VS.71).aspx – sje397

Trả lời

32

std::count_if(v.begin(), v.end(), std::bind1st(std::less<double>(), 0)) là những gì bạn muốn.

Nếu bạn đã using namespace std, phiên bản rõ ràng hơn lần đọc

count_if(v.begin(), v.end(), bind1st(less<double>(), 0)); 

Tất cả các công cụ này thuộc về <functional> tiêu đề, cùng với các vị từ tiêu chuẩn khác.

+9

Hoặc bạn có thể 'bind2nd (lớn hơn (), 0)'. Sự lựa chọn là của bạn! –

+0

Vì anh ta đã 'sử dụng không gian tên std;' nó sẽ rõ ràng hơn nếu không có tất cả tiền tố 'std ::'. – sje397

+0

Một giải pháp thanh lịch. Nếu tôi cũng cần tính tất cả các giá trị không âm thì sao? – Wawel100

1
cout<<std::count_if (Array.begin(),Array.end(),std::bind2nd (std::greater<double>(),0)) ; 
greater_equal<type>() -> if >= 0 
12

Nếu bạn đang biên soạn với MSVC++ 2010 hoặc GCC 4.5+ bạn có thể sử dụng chức năng thực lambda:

std::count_if(Array.begin(), Array.end(), [](double d) { return d > 0; }); 
Các vấn đề liên quan