快速业务通道

STL学习系列之二:标准模板库(STL)介绍

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29
ot;);
 SalesRecords.push_back("0003 Toothbrush");
 SalesRecords.push_back("0004 Toothpaste");
 SalesRecords.push_back("0003 Toothbrush");

 string VariableToothbrushCode("0003");
 int NumberOfToothbrushes(0);
 NumberOfToothbrushes=count_if (SalesRecords.begin(), SalesRecords.end(),
       IsAToothbrush(VariableToothbrushCode));
 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通用算法。

8 使用STL通用算法find()在list中查找对象

我们如何在list中查找东西呢?STL的通用算法find()和find_if()可以做这些。就象for_each(), count(), count_if() 一样,这些算法也使用iterator范围,这个范围指出一个list或任意 其他容器中的一部分来处理。通常首iterator指着开始的位置,次iterator指着停止处理的地方。由次iterator指出的元素不被处理。这是find()如何工作:

/*
|| How to find things in an STL list
*/
#include <string>
#include <list>
#include <algorithm>
#include <iostream>
using namespace std;
void main (void) {
  list<string> Fruit;
  list<string>::iterator FruitIterator;
  Fruit.push_back("Apple");
  Fruit.push_back("Pineapple");
  Fruit.push_back("Star Apple");
  FruitIterator = find (Fruit.begin(), Fruit.end(), "Pineapple");
  if (FruitIterator == Fruit.end()) {
    cout << "Fruit not found in list" << endl;
  }
  else {
    cout << *FruitIterator << endl;
  }
}

输出是:

Pineapple

如果没有找到指出的对象,就会返回Fruit.end()的值,要是找到了就返回一个指着找到的对象的iterator

9 使用STL通用算法find_if()在list中搜索对象

这是find()的一个更强大的版本。这个例子演示了find_if(),它接收一个函数对象的参数作为参数, 并使用它来做更复杂的评价对象是否和给出的查找条件相付。假设我们的list中有一些按年代排列的包含了事件和日期的记录。我们希望找出发生在1997年的事件。

/*
|| How to find things in an STL list MkII
*/
#include <string>
#include <list>
#include <algorithm>
class EventIsIn1997 {
public:
  bool operator () (string& EventRecord) {
    // year field is

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号