看一篇STL学习的文章,作者为Scott Field ,不知道为什么作者使用count和count_if函数都是使用四个参数,计数放到第四个参数,返回值是bool型。文章中解释的是“每次当第三个条件满足时,把第四个变量加一”。但我查阅MSDN发现都是三个参数,返回size_t。怀疑是STL标准的版本问题。
(文章地址:http://www.stlchina.org/twiki/bin/view.pl/Main/STLIntroduce)
count_if函数原型如下:

Code
1
template<class InputIterator, class Predicate> inline
2
size_t count_if(
3
InputIterator First,
4
InputIterator Last,
5
Predicate P
6
)
7
前两个参数是iterator(迭代器),表示查找半闭合区间的前后两个位置,第三个参数为一个用户定义的predicate function object,而predicate意思就是说是一个返回值是bool型的仿函数(function object,也称functor)。
count函数原型如下:

Code
1
template<class InputIterator, class T> inline
2
size_t count(
3
InputIterator First,
4
InputIterator Last,
5
const T& Value
6
)
7
前两个参数如上,只是第三个参数是一个T类型的常量,相比之下,count_if具有更大的灵活性。
一切以MSDN为准
,所以使用应改为如下:

Code
1
/**//*
2
|| Using a more complex function object
3
*/
4
#include <iostream.h>
5
#include <string>
6
#include <list>
7
#include <algorithm>
8
9
//predicate function object
10
class IsAToothbrush
11

{
12
public:
13
IsAToothbrush(string& InToothbrushCode) :
14
ToothbrushCode(InToothbrushCode)
{}
15
bool operator() (string& SalesRecord)
16
{
17
return SalesRecord.substr(0,4)==ToothbrushCode;
18
}
19
private:
20
string ToothbrushCode;
21
};
22
23
int main (void)
24

{
25
list<string> SalesRecords;
26
27
SalesRecords.push_back("0001 Soap");
28
SalesRecords.push_back("0002 Shampoo");
29
SalesRecords.push_back("0003 Toothbrush");
30
SalesRecords.push_back("0004 Toothpaste");
31
SalesRecords.push_back("0003 Toothbrush");
32
33
string VariableToothbrushCode("0003");
34
35
int NumberOfToothbrushes(0);
36
/**//*
37
count_if (SalesRecords.begin(), SalesRecords.end(),
38
IsAToothbrush(VariableToothbrushCode),
39
NumberOfToothbrushes);
40
*/
41
NumberOfToothbrushes = count_if (SalesRecords.begin(), SalesRecords.end(),
42
IsAToothbrush(VariableToothbrushCode));
43
cout << "There were "
44
<< NumberOfToothbrushes
45
<< " toothbrushes matching code "
46
<< VariableToothbrushCode
47
<< " sold"
48
<< endl;
49
}
50
编译环境:WINDOWS XP SP3,vs2005