展会信息港展会大全

CUJ:标准库:标准库中的搜索算法
来源:互联网   发布日期:2011-09-07 13:56:53   浏览:31477次  

导读:CUJ:标准库:标准库中的搜索算法...

VC语言

本类阅读TOP10

·VC++下使用ADO编写数据库程序
·VC++ 学习笔记(二)
·Windows消息大全
·每个开发人员现在应该下载的十种必备工具
·在2000和xp下,隐藏进程,VC6.0测试通过!!!
·用Visual C++打造IE浏览器(1)
·Netmsg 局域网聊天程序
·教你用VC6做QQ对对碰外挂程序
·VC++学习笔记(四)
·VC++中经常使用的函数!~~


→ 分类导航

软件工程.NET开发

CUJ:标准库:标准库中的搜索算法

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

The Standard Librarian: Searching in the Standard Library

Matthew Austern

http://www.cuj.com/experts/1911/austern.htm?topic=experts

 

The genius as well as the oversights in the design of the Standard C++ library surface in a simple discussion of its linear and binary search algorithms.

--------------------------------------------------------------------------------

    如果你储存着一系列的元素,或许原因理由之一是因此你能够在它里面找到些对象。在一个集合中找到一个特别的条目是个很重要的问题;所有的书都会写到它。不奇怪,标准C++运行库提供了许多不同的搜索技术。

    在 C++运行库中,指明一个集合的常用方法是通过iterator指示出区间。区间可以被写为[first, last),此处,*first是区间内的第一个元素而last则指向最后一个元素的下一个。本文展示了我们如何考虑一个通用问题:给定一个区间和一个准则,找到指向第一个满足准则的元素的iterator。因为我们将区间表示为不对称的形式,于是避开了一个特殊情况:搜索失败可以返回last,没有任何元素的区间可以写为[i, i)。

线性搜索和它的变种

    最简单的搜索是线性搜索,或,如Knuth所称呼的,顺序搜索:依次查看每个元素,检查它是否为我们正在搜索的那个。如果区间中有N个元素,最坏的情况就需要N次比较。

    标准运行库提供了线性搜索的一些版本;两个最重要的版本是find() (它接受一个区间和值x,并查找等价于x的元素)和find_if()(接受一个区间和判决条件p,并查找满足p的元素)。线性搜索的其它版本是find_first_of()(接受两个区间,[first1,last1)和[first2,last2) ,并在[first1, last1)中查找第一个等价于[first2, last2)中任何一个元素的元素]和adjacent_find()(接受单一区间,并查找第一个等价于其后继元素的元素)。

    举例来说,假如,v是一个int的vector。你能用下面的代码查找第一个0:

vector<int>::iterator i =

  find(v.begin(), v.end(), 0);

    你也能这样查找第一个非0值:

vector<int>::iterator i =

  find_if(v.begin(), v.end(),

          not1(bind2nd(equal_to<int>(),

          0)));

    你能这样查找第一个小质数:

A[4] = { 2, 3, 5, 7 };

vector<int>::iterator i =

  find_first_of(v.begin(), v.end(),

                A+0, A+4);

    你能这样找到第一个重复对:

vector<int>::iterator i =

  adjacent_find(v.begin(), v.end());

    没有任何独立版本以对区间进行逆向搜索,因为你不需要:你能用一个简单的iterator adaptor来达到相同的效果。比如,在v中找到最后一个0,可以这么写:

vector<int>::reverse_iterator i =

  find(v.rbegin(), v.rend(), 0);

    线性搜索是一个简单的算法,它的实现看起来没什么可讨论的。许多书(包括我的)展示了std::find()的一个简单的实现:

template <class InIter, class T>

InIter find(InIter first, InIter last,

            const T& val)

{

  while (first != last && !

    (*first == val))

赞助本站

人工智能实验室
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港