STL库查找算法——如上下界查找,最大最小值查找,统计次数,二分查找,子区间匹配查找,集合(集合内任意一个元素匹配)查找

本文主要是介绍STL库查找算法——如上下界查找,最大最小值查找,统计次数,二分查找,子区间匹配查找,集合(集合内任意一个元素匹配)查找,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

以下算法参数均可以迭代器或指针。

单个元素查找

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

1

2

template <class InputIterator, class T>

InputIterator find (InputIterator first, InputIterator last, const T& val);

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

1

2

3

4

5

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表示是否存在

1

2

3

4

5

6

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。

1

2

3

4

5

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。

1

2

3

4

5

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 操作。

1

2

3

4

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] 的位置

1

2

3

4

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的子区间:

1

2

3

4

5

6

7

8

9

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() 查找给定集合中的任意一个元素

参考链接:https://www.cnblogs.com/gtarcoder/p/5811725.html

这篇关于STL库查找算法——如上下界查找,最大最小值查找,统计次数,二分查找,子区间匹配查找,集合(集合内任意一个元素匹配)查找的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/935607

相关文章

SQL Server跟踪自动统计信息更新实战指南

《SQLServer跟踪自动统计信息更新实战指南》本文详解SQLServer自动统计信息更新的跟踪方法,推荐使用扩展事件实时捕获更新操作及详细信息,同时结合系统视图快速检查统计信息状态,重点强调修... 目录SQL Server 如何跟踪自动统计信息更新:深入解析与实战指南 核心跟踪方法1️⃣ 利用系统目录

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

python3如何找到字典的下标index、获取list中指定元素的位置索引

《python3如何找到字典的下标index、获取list中指定元素的位置索引》:本文主要介绍python3如何找到字典的下标index、获取list中指定元素的位置索引问题,具有很好的参考价值,... 目录enumerate()找到字典的下标 index获取list中指定元素的位置索引总结enumerat

CSS实现元素撑满剩余空间的五种方法

《CSS实现元素撑满剩余空间的五种方法》在日常开发中,我们经常需要让某个元素占据容器的剩余空间,本文将介绍5种不同的方法来实现这个需求,并分析各种方法的优缺点,感兴趣的朋友一起看看吧... css实现元素撑满剩余空间的5种方法 在日常开发中,我们经常需要让某个元素占据容器的剩余空间。这是一个常见的布局需求

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif