STL中的查找算法
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中的查找算法的更多相关文章
- STL中的所有算法(70个)
STL中的所有算法(70个)----9种类型(略有修改by crazyhacking) 参考自: http://www.cppblog.com/mzty/archive/2007/03/14/1981 ...
- Java中的查找算法之顺序查找(Sequential Search)
Java中的查找算法之顺序查找(Sequential Search) 神话丿小王子的博客主页 a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数 ...
- STL中的排序算法
本文转自:STL中的排序算法 1. 所有STL sort算法函数的名字列表: 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 ...
- php 中的查找算法 和 排序方法(多字段排序)
一.查找算法 1.顺序查找(一个一个查,效率低,不用多说) 2.二分查找 /* php 二分查找 在$a数组里查找$x的位置 $a必须是一个以升序排序后的数组 */ function binsearc ...
- stl常用的查找算法
#include<iostream> using namespace std; #include"vector" #include"algorithm&quo ...
- STL中sort排序算法第三个参数_Compare的实现本质
关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...
- 快速排序及STL中的sort算法
快速排序基本思想是,对待排序序列进行划分(Partition),一次划分,选择一个元素作为枢轴,然后将所有比枢轴小的元素放到枢轴的左边,将比枢轴大的元素放到枢轴的右边.然后对该枢轴划分的左右子序列分别 ...
- STL中主要的算法(一)
一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template ...
- STL中的查找
一.查找 1.头文件 #include <algorithm> 2.使用方法 1.binary_search:查找某个元素是否出现.O(logn) a.函数模板:binary_search ...
随机推荐
- ansible使用笔记
ansible使用笔记 介绍 ansible 是一个模型驱动的配置管理器,支持多节点发布.远程任务执行.默认使用 SSH 进行远程连接.无需在被管理节点上安装附加软件,可使用各种编程语言进行扩展.an ...
- 字符串数组(String []) 去掉重复值的方法
public class Demo { /** * 去掉重复值 */ public static void main(String[] args) { String test = "100, ...
- lua module package.seeall选项
module 与 package.seeall http://blog.codingnow.com/2006/02/lua_51_module.html 使用 module("test&qu ...
- px、em、rem区别介绍
px.em.rem区别介绍 PX px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的. PX特点 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能 ...
- Markdown 语法和 MWeb 写作使用说明
---恢复内容开始--- # Markdown 语法和 MWeb 写作使用说明 Markdown 的设计哲学 Markdown 的目標是實現「易讀易寫」. 不過最需要強調的便是它的可讀性.一份使用 M ...
- S3C2440 裸机程序之音频
mini2440之Main分析 2012-03-17 20:51:29 分类: 嵌入式 /****************************************************** ...
- 闭包(closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解 ...
- shell脚本中切换用户执行相应的命令或者shell脚本的方法
通常在执行自动化过程中可能需要将root用户切换到其他用户进行执行,如:oralce 但是,执行的命令又要回到root用户下,继续执行root用户下的其他命令. 此时需要了解 su 命令中的参数 -c ...
- jQuery与其他JS库冲突解决
实际开发中遇到JQuery与其他js库起冲突 究其原因,是它们的全局对象定义冲突了,特别是变量”$”, 可重载$函数.使用jQuery.noConflict()就可以通过重载$函数 例:项目中应用的 ...
- [python]使用virtualenv处理python版本问题
1. 更新virutalenv $ sudo easy_install --upgrade virtualenv 2. 新建virtualenv实例, 确保在your home directory ...