标准模板库(STL)学习之List容器___4

 使用count_if()的一个更加复杂的函数对象

  我们可以更进一步的研究一下函数对象。假设我们需要传递更多的信息给一个函数对象。我们不能通过 调用operator来作到这点,因为必须定义为一个list的中的对象的类型。 然而我们通过为IsAToothbrush指出一个非缺省的构造函数就可以用任何我们所需要的信息来初始化它了。 例如,我们可能需要每个牙刷有一个不定的代码。我们可以把这个信息加到下面的函数对象中:

/*
|| Using a more complex function object
*/
#include <iostream.h>
#include <string>
#include <list>
#include <algorithm>

class IsAToothbrush
{
 public:
  IsAToothbrush(string& InToothbrushCode) :
  ToothbrushCode(InToothbrushCode) {}
  bool operator() (string& SalesRecord)
  {
   return SalesRecord.substr(0,4)==ToothbrushCode;
  }
 private:
  string ToothbrushCode;
};

int main (void)
{
 list<string> SalesRecords;

 SalesRecords.push_back("0001 Soap");
 SalesRecords.push_back("0002 Shampoo");
 SalesRecords.push_back("0003 Toothbrush");
 SalesRecords.push_back("0004 Toothpaste");
 SalesRecords.push_back("0003 Toothbrush");

 string VariableToothbrushCode("0003");

 int NumberOfToothbrushes(0);
 count_if (SalesRecords.begin(), SalesRecords.end(),
 IsAToothbrush(VariableToothbrushCode),
 NumberOfToothbrushes);
 cout << "There were "
 << NumberOfToothbrushes
 << " toothbrushes matching code "
 << VariableToothbrushCode
 << " sold"
 << endl;
}

  程序的输出是:

  There were 2 toothbrushes matching code 0003 sold 这个例子演示了如何向函数对象传递信息。你可以定义任意你想要的构造函数,你可以再函数对象中做任何你 想做的处理,都可以合法编译通过。

  你可以看到函数对象真的扩展了基本记数算法。

  到现在为止,我们都学习了:

   ·定义一个list

   ·向list中加入元素

   ·如何知道list是否为空

   ·如何使用for循环来遍历一个list

   ·如何使用STL的通用算法for_each来遍历list

   ·list成员函数begin() 和 end() 以及它们的意义

   ·iterator范围的概念和一个范围的最后一个位置实际上并不被处理这一事实

   ·如何使用STL通用算法count()和count_if()来对一个list中的对象记数

   ·如何定义一个函数对象

  我选用这些例子来演示list的一般操作。如果你懂了这些基本原理,你就可以毫无疑问的使用STL了 建议你作一些练习。我们现在用一些更加复杂的操作来扩展我们的知识,包括list成员函数和STL通用算法。
posted @ 2009-02-23 18:14  pjh123  阅读(228)  评论(0编辑  收藏  举报