泛型算法(十九)之搜索算法

1、ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last):在序列中发现第一对相邻且值相等的元素。

    std::vector<int> c = {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9};

    //在c中发现第一对相邻且值相等的元素
    auto iter = std::adjacent_find(c.begin(), c.end());
    //输出
    std::cout << *iter;
    //打印结果:4

2、ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator last, BinaryPredicate pred):重载版本。用给定谓词pred代替了operator==

自己实现pred,向算法定制操作。

3、binary_search(ForwardIterator first, ForwardIterator last, const T& val):对一个升序序列做二分搜索,判定序列中是否有给定值val。

    std::vector<int> c = {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9};

    //判断c中是否有值为5的元素
    bool i = std::binary_search(c.begin(), c.end(), 5);
    //输出
    std::cout << (int)i;
    //打印结果:1

4、binary_search(ForwardIterator first, ForwardIterator last, const T& val, Compare comp):重载版本。用给定谓词pred代替了operator==

自己实现comp,向算法定制操作。

5、find(InputIterator first, InputIterator last, const T& val):对一个输入序列,找到第一个等于给定值的元素。

    std::vector<int> c = {0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9};

    //在c中找到第一个值为5的元素
    auto iter = std::find(c.begin(), c.end(), 5);
    //输出
    std::cout << *iter;
    //打印结果:5

6、ForwardIterator1 find_end(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator last2):在序列[first1, last1)中,找到序列[first2, last2)最后出现的位置。

    std::vector<int> c1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<int> c2 = {5, 6, 7};

    //在c1中找到c2最后出现的位置
    auto iter = std::find_end(c1.begin(), c1.end(), c2.begin(), c2.end());
    //输出
    std::cout << *iter;
    //打印结果:5

7、ForwardIterator1 find_end(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator last2, BinaryPredicate pred):重载版本,用给定谓词pred代替operator==

自己实现pred,向算法定制操作。

8、find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2):在序列[first1, last1)中,找到集合[first2,last2)中任何一个元素的第一次出现。

    std::vector<int> c1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<int> c2 = {5, 6, 7};

    //在c1中找到c2最后出现的位置
    auto iter = std::find_first_of(c1.begin(), c1.end(), c2.begin(), c2.end());
    //输出
    std::cout << *iter;
    //打印结果:5

9、find_first_of(InputIterator first1, InputIterator last1, ForwardIterator first2, ForwardIterator last2, BinaryPredicate pred):重载版本,用给定谓词pred代替operator==

自己实现pred,向算法定制操作。

10、find_if(InputIterator first, InputIterator last, UnaryPredicate pred):在序列中返回满足谓词pred的第一个元素

    std::vector<int> c = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    //查找c中第一个大于5的元素
    auto iter = std::find_if(c.begin(), c.end(), [](int element){
        return element > 5;
    });
    //输出
    std::cout << *iter;
    //打印结果:6

11、find_if_not(InputIterator first, InputIterator last, UnaryPredicate pred):C11算法,在序列中返回不满足谓词pred的第一个元素

    std::vector<int> c = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};

    //查找c中第一个不大于5的元素
    auto iter = std::find_if_not(c.begin(), c.end(), [](int element){
        return element > 5;
    });
    //输出
    std::cout << *iter;
    //打印结果:0

12、search(ForwardIterator1 first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2):在序列[first1,last1)中,找到序列[first2,last2)首次出现的位置

    std::vector<int> c1 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::vector<int> c2 = {3, 4, 5};
    //在序列c1中找到首次出现序列c2的位置
    auto iter = std::search(c1.begin(), c1.end(), c2.begin(), c2.end());
    //输出
    std::cout << *iter;
    //打印结果:3

13、search(ForwardIterator1 first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred):重载版本,用给定谓词pred代替operator==

自己实现pred,向算法定制操作。

14、search_n(ForwardIterator first, ForwardIterator last, Size count, const T& val):给定序列中,搜索给定值val连续出现n次的位置。

不知道是不是STL供应商不同的原因,我的编译器的功能貌似不是描述的那样-。-

15、search_n(ForwardIterator first, ForwardIterator last, Size count, const T& val, BinaryPredicate pred),重载版本,用给定谓词pred代替operator==

时间: 2024-10-25 06:41:24

泛型算法(十九)之搜索算法的相关文章

十大基础实用算法之迪杰斯特拉算法、最小生成树和搜索算法

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

每日算法之二十九:Search in Rotated Sorted Array

在一个经过旋转后的有序数组中查找一个目标元素. Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherwise return -1.

每日算法之三十九:Pow(x, n)

实现浮点类型的幂运算,函数原型为: double pow(double x, int n) 在求解这个问题的时候是一个很挣扎的过程,因为它不是报错而是一直提示你超出时间,那么必须一次次的考虑怎样降低时间复杂度. 首先最直接的思路是下面这样的,就跟直观的数学求解一样. double pow(double x, int n) { if(n==0) return 1.0; if(n<0) return 1.0/pow(x,-n); return x*pow(x,n-1); } 但是会提示你超出时间,这

经典算法题每日演练——第十九题 双端队列

原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in love,嗨,慢慢调整心态吧, 这篇就选一个简单的数据结构聊一聊,话说有很多数据结构都在玩组合拳,比如说:块状链表,块状数组,当然还有本篇的双端队列,是的,它就是 栈和队列的组合体. 一:概念 我们知道普通队列是限制级的一端进,另一端出的FIFO形式,栈是一端进出的LIFO形式,而双端队列就没有这样的限制级,也就是我们可以在 队列两端进行

七月算法--12月机器学习在线班-第十九次课笔记-深度学习--CNN

七月算法--12月机器学习在线班-第十九次课笔记-深度学习--CNN 七月算法(julyedu.com)12月机器学习在线班学习笔记http://www.julyedu.com 1,卷积神经网络-CNN 基础知识 三个要点 1: 首先将输入数据看成三维的张量(Tensor) 2: 引入Convolution(卷积)操作,单元变成卷积核,部分连接共享权重 3:引入Pooling(采样)操作,降低输入张量的平面尺寸 ,1.1 张量(Tensor) 高,宽度,深度,eg:彩色图像:rgb,3个深度,图

第十六篇:泛型算法结构

前言 C++提供了很多算法(超过一百个),要想掌握这些算法的使用需要将它们都死记下来吗?当然不用了,本文将为你剖析泛型算法的基本结构,让你以后对这些算法做到“ 望名生义 ”. 算法的形参结构 绝大多数算法的形参采用以下四种形式之一: 1. 算法名 ( 起始迭代器, 末端迭代器, 其他参数 ) 说明:起始迭代器和末端迭代器标识了算法的输入范围,其他参数与算法特性有关. 2. 算法名 ( 起始迭代器, 末端迭代器, 插入迭代器/流迭代器, 其他参数 ) 说明:起始迭代器和末端迭代器标识了算法的输入范

C++学习笔记(十六):对vector进行更多的操作——泛型算法

先强调一下,这里的泛型算法实际不光光是对vector的操作,对于"顺序容器"均可以. 但是什么是顺序容器: 我们都知道,容器就是一些特定类型对象的集合.而顺序容器为程序员提供了控制元素存储和访问的能力.这种容器的一个显著的特征,就是容器中元素的顺序不依赖于元素的值,而是与加入容器时的位置有关.常见的顺序容器有vector.deque(双端队列).list(双向链表).forward_list(单向链表).array(固定大小数组).string. 了解了顺序容器,现在以vector为例

第十九章 APO连接与网络v节点

                  第十九章   APO连接与网络v节点       在编写网络底层实现前,需要做许多的准备工作:除了修改前面的章节外,可能还需写3章:本章.文件号管理类的实现.本地内存管理类的实现.我很希望最终的网络编程能给我惊喜:IP/TCP/UDP/ICMP的实现.包括所有的网络服务器的实现(HTTP.DNS.FTP等等),能到达300行的代码量:多于300行代码量那就更好了.我会很高兴.网络编程第一层简为socket层,第二层简称为TCP层,第三层简称为IP层:以后,不再

设计模式 ( 十九 ):Strategy策略模式 -- 行为型

设计模式 ( 十八 ) 策略模式Strategy(对象行为型) 1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能.如查找.排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法:当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择.这

QT开发(三十九)——GraphicsView框架

QT开发(三十九)--GraphicsView框架 本文主要翻译自QT 5.6.2GraphicsView官方文档 一.GraphicsView框架简介 QT4.2开始引入了Graphics View框架用来取代QT3中的Canvas模块,并作出了改进,Graphics View框架实现了模型-视图结构的图形管理,能对大量图元进行管理,支持碰撞检测,坐标变换和图元组等多种方便的功能. GraphicsView框架结构主要包含三个主要的类QGraphicsScene(场景).QGraphicsVi