STL中有很多算法,这些算法可以用到一个或多个STL容器(因为STL的一个设计思想是将算法和容器进行分离),也可以用到非容器序列比如数组中。众多算法中,查找算法是应用最为普遍的一类。

单个元素查找

1、 find() 比较条件为元素是否相等的查找:

    template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);

2、find_if() 自定义比较函数 
从给出的区间中查找第一个满足比较函数的元素

bool cmpFunction (int i) {
return ((i%30)==0);
}
it = std::find_if (myvector.begin(), myvector.end(), cmpFunction);
std::cout << "first:" << *it <<std::endl;

3、count() 统计元素出现的次数 
std::count() 统计区间中某个元素出现的次数 
std::count_if() 自定义比较函数

4、min_element() 查找给定区间内最小值

5、max_element() 查找给定区间内最大值

6、binary_search() 有序区间的二分查找 
binary_search() 用来在一个有序区间中使用二分法查找元素是否在这个区间中,该算法的返回值为bool表示是否存在

template <class ForwardIterator, class T>
bool binary_search (ForwardIterator first, ForwardIterator last, const T& val)
{
first = std::lower_bound(first,last,val);
return (first!=last && !(val<*first));
}

7、lower_bound() 返回有序序列给定区间[first, last) (左闭右开)内的第一个大于等于value的位置。如果所有元素都小于value,则返回last。

template< class ForwardIterator, class Type >
ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const Type &value ); template< class ForwardIterator, class Type, class Compare>
ForwardIterator lower_bound( ForwardIterator first, ForwardIterator last, const Type &value, Compare comp ); //支持自定义比较函数

8、upper_bound() 返回有序序列给定区间[first, last) (左闭右开)内的第一个大于value的位置。如果所有元素都小于等于value,则返回last。

template< class ForwardIterator, class Type >
ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const Type &value ); template< class ForwardIterator, class Type, class Compare>
ForwardIterator upper_bound( ForwardIterator first, ForwardIterator last, const Type &value, Compare comp ); //支持自定义比较函数

其中lower_bound/upper_bound 可以用于任何支持随机访问的容器中,比如vector,deque,数组。对于不支持随机访问的容器如 set/map,这些容器有同名的方法来进行 lower_bound/upper_bound 操作。

map::lower_bound(key):返回map中第一个大于或等于key的迭代器指针
map::upper_bound(key):返回map中第一个大于key的迭代器指针
set::lower_bound(val):返回set中第一个大于或等于val的迭代器指针
set::upper_bound(val):返回set中第一个大于val的迭代器指针

区间查找(区间整体匹配)

1、search() 查找子区间首次出现的位置 
find() 用来查找单个元素,search() 用来查找一个子区间,比如 从myvector中查找自取件[20, 30] 的位置

int needle1[] = {20,30};
it = std::search (myvector.begin(), myvector.end(), needle1, needle1+2);
if (it!=myvector.end())
std::cout << "needle1 found at position " << (it-myvector.begin()) << '\n';

search() 支持自定义比较函数,比如查询给定区间中每个元素比目标区间小1的子区间:

bool cmpFunction (int i, int j) {
return (i-j==1);
}
int myints[] = {1,2,3,4,5,1,2,3,4,5};
std::vector<int> haystack (myints,myints+10); int needle2[] = {1,2,3};
// using predicate comparison:
it = std::search (haystack.begin(), haystack.end(), needle2, needle2+3, cmpFunction);

2、find_end() 查找子区间最后一次出现的位置 
search()查找子区间第一次出现的位置,而find_end() 用来查找子区间最后一次出现的位置,find_end()支持自定义比较函数。

3、equal() 判断两个区间是否相等

4、mismatch() 查询两个区间首次出现不同的位置

集合查找(集合内任意一个元素匹配)

find_first_of() 查找给定集合中的任意一个元素

STL中的查找算法的更多相关文章

  1. STL中的所有算法(70个)

    STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...

  2. Java中的查找算法之顺序查找(Sequential Search)

    Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...

  3. STL中的排序算法

    本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名    功能描述 sort   对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...

  4. php 中的查找算法 和 排序方法(多字段排序)

    一.查找算法 1.顺序查找(一个一个查,效率低,不用多说) 2.二分查找 /* php 二分查找 在$a数组里查找$x的位置 $a必须是一个以升序排序后的数组 */ function binsearc ...

  5. stl常用的查找算法

    #include<iostream> using namespace std; #include"vector" #include"algorithm&quo ...

  6. STL中sort排序算法第三个参数_Compare的实现本质

    关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...

  7. 快速排序及STL中的sort算法

    快速排序基本思想是,对待排序序列进行划分(Partition),一次划分,选择一个元素作为枢轴,然后将所有比枢轴小的元素放到枢轴的左边,将比枢轴大的元素放到枢轴的右边.然后对该枢轴划分的左右子序列分别 ...

  8. STL中主要的算法(一)

    一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template  ...

  9. STL中的查找

    一.查找 1.头文件 #include <algorithm> 2.使用方法 1.binary_search:查找某个元素是否出现.O(logn) a.函数模板:binary_search ...

随机推荐

  1. asp.net mvc 控制器中操作方法重载问题 解决

    Controllers: public ActionResult Index() { return View(db.GuestBooks.ToList()); } // // GET: /Guest2 ...

  2. 深入理解asp.net里的HttpModule机制

    刚工作的时候看<asp.net深入解析>,第一次知道HttpModule和HttpHandler.当时对我而言,它们不过就是两个新名词而已,仅仅知道工作原理但是理解的不深刻.随着经验的累积 ...

  3. MySQL乱码解决办法

    MySQL支持几十种编码方式,并且默认的编码为:latinl,如果MySQL出现了乱码情况,不要慌乱,一下为你介绍两种解决编码方式: 在控制台输入命令,注意MySQL中的UTF-8写成utf8,例如我 ...

  4. 史上最臭名昭著五大软件Bug

    在现今数字年代,计算机bug不但困扰着每个程序员,更会无可避免影响我们的生活,小到每个人的衣食住行,大到国家经济,世界局势.随着我们的生活方式渐渐的数字化.互联网化,数字世界的找虫和杀虫就变得越来越重 ...

  5. 大商创 sql追踪 卖家入驻

    ' ' ' ', '', '', '') ' Query ' Query ' Query ' Query ' Query ' Query ' Query ' Query ' Query ' Query ...

  6. 看StackOverflow如何用25台服务器撑起5.6亿的月PV(微软的架构)

     问答社区网络 StackExchange 由 100 多个网站构成,其中包括了 Alexa 排名第 54 的 StackOverflow.StackExchang 有 400 万用户,每月 5.6 ...

  7. javascript实现有向无环图中任意两点最短路径的dijistra算法

    有向无环图 一个无环的有向图称做有向无环图(directed acycline praph).简称DAG 图.DAG 图是一类较有向树更一般的特殊有向图, dijistra算法 摘自 http://w ...

  8. 时光煮雨 Unity3D实现2D人物动画① UGUI&Native2D序列帧动画

    系列目录 [Unity3D基础]让物体动起来①--基于UGUI的鼠标点击移动 [Unity3D基础]让物体动起来②--UGUI鼠标点击逐帧移动 时光煮雨 Unity3D让物体动起来③—UGUI DoT ...

  9. excel转换日期格式,将yyyymmdd类型日期转换成yyyy-mm-dd等日期类型方法

    源数据日期格式:例如: 20160420 20160422 目标日期格式类型: 2016-4-20 2016-4-22 或 2016/04/20 2016/04/22 方法: 一.选中相应数据的单元格 ...

  10. JQ 全选、全不选

    $(document).ready(function() { $("#isalldebt").click(function() { if ($(this).attr("c ...