c++ 标准库二分查找

C++标准库中的二分查找可以通过std::lower_boundstd::upper_bound函数实现。这两个函数都在<algorithm>头文件中定义,并接受一个排序的范围(例如,std::vectorstd::dequestd::array等)以及一个要查找的值。

std::lower_bound返回指向在范围中第一个不小于(即大于或等于)给定值的元素的迭代器。std::upper_bound则返回指向在范围中第一个大于给定值的元素的迭代器。

下面是一个使用std::lower_bound进行二分查找的例子:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    int target = 6;

    auto it = std::lower_bound(v.begin(), v.end(), target);

    if (it != v.end() && *it == target) {
        std::cout << "Found " << target << " at position " << std::distance(v.begin(), it) << std::endl;
    } else {
        std::cout << target << " not found" << std::endl;
    }

    return 0;
}

在这个例子中,我们首先定义了一个排序的std::vector,然后定义了一个目标值target。我们使用std::lower_bound查找target,然后检查返回的迭代器是否指向target。如果是,我们就打印出targetvector中的位置。否则,我们打印出target未找到的消息。

如果你想查找的是范围中是否包含特定的值,并且不关心具体的位置,你可以将std::lower_boundstd::upper_bound的结果进行比较。如果它们相同,那么范围中不包含该值。否则,范围中包含该值。

if (std::lower_bound(v.begin(), v.end(), target) != std::upper_bound(v.begin(), v.end(), target)) {
    std::cout << target << " found in the range" << std::endl;
} else {
    std::cout << target << " not found in the range" << std::endl;
}

请注意,二分查找要求输入范围必须是排序的。如果输入范围未排序,那么结果将是未定义的。

你可能还喜欢下面这些文章

命令行下的mongo初试

从连接mongo开始,熟悉一下命令行下面的mongo使用连接普通连接mongo mongodb://ip:port查看数据库show dbs选择或者创建数据库use mydb创建一个集合比如创建一个mycollection的集合db.createCollection('mycollection')显示数据库中所有的集合show collections向集合中写入数据假设我们创建了一个mycollection集合,实际上当我们没有创建mycollection集合的时候,执行下面的命令mongo会自动创建一个mycollection集合db.mycollection.insert({"foo",'

记一次PHP7中正则匹配失败,原因为PREG_JIT_STACKLIMIT_ERROR

最近弄了一台机器,安装php7,性能很棒!但是在运行中发现之前的程序运行有些异常,有些正则匹配不到了,开始怀疑是正则表达式的问题,一番查找发现php7并没有对正则进行改动。接下来就是一番痛苦的查找bug,我甚至写了一个非正则的函数来替换原来的正则匹配,不过太消耗cpu而放弃了。还是继续找bug,打印出正则的错误信息echo array_flip(get_defined_constants(true));出现了 PREG_JIT_STACKLIMIT_ERROR官方给出的提示是: (自 PHP 7.0.0 起)当 PCRE 函数因 JIT 栈空间限制而失败, preg_last_error(

c++ vector取最后一个元素

在C++中,你可以使用的成员函数来获取最后一个元素。这个函数返回对向量中最后一个元素的引用。以下是一个简单的示例:在这个例子中,我们创建了一个包含五个整数的。然后,我们使用函数获取最后一个元素,并将其存储在变量中。最后,我们打印出这个元素。请注意,如果向量是空的(即,不包含任何元素),调用函数将导致未定义行为。因此,在调用之前,最好先检查向量是否为空,这可以通过调用成员函数来完成。

mysq常用函数大全

很少用到,但是有时候又必须用到,这里收集一下mysql的常用函数一、数学函数ABS(x)   返回x的绝对值BIN(x)   返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x)   返回大于x的最小整数值EXP(x)   返回值e(自然对数的底)的x次方FLOOR(x)   返回小于x的最大整数值GREATEST(x1,x2,...,xn)返回集合中最大的值LEAST(x1,x2,...,xn)      返回集合中最小的值LN(x)                    返回x的自然对数LOG(x,y)返回x的以y为底的对数MOD(x,y)              

C++ 判断 char* 是否相等

在C++中, 是一个指向字符的指针,通常用于表示C风格的字符串。判断两个  指针是否相等,需考虑两个方面:判断指针本身的地址是否相等:可以通过直接使用  或  操作符来实现。 和  指向不同的地址(尽管它们的内容相同),而  和  指向相同的地址。2. 判断指针指向的字符串内容是否相等:需要使用  函数,它是C标准库中的一部分,在C++中可用。 函数用于比较 、 和  的内容。如果内容相同, 返回

C++实现python字符串的endswith方法

可以使用的或方法配合比较运算符来模拟方法的功能。下面是一个示例函数,它检查一个字符串是否以另一个字符串结束:在这个示例中,函数接受两个参数:和。函数首先检查的长度是否大于或等于的长度。如果不是,那么显然不能以结束,函数返回。否则,函数使用方法从的末尾提取与长度相同的子字符串,并将其与进行比较。如果它们相等,那么以结束,函数返回。否则,函数返回。请注意,这个函数是区分大小写的。如果你想要一个不区分大小写的版本,你可以在比较之前使用和函数将和转换为小写。在这个版本中,函数首先使用和函数将和转换为小写。然后,它调用函数来检查转换后的字符串是否以结束。

Shell中的条件判断语句if的用法

shell中的if语法是最让我头疼的语法之一,它的判断就向使用USB插头一样——拿起来插入不行,翻转再插入还不行,再翻转插入行了!为了搞清楚这部分语言,我收集了一些文章关于if条件判断的用法,希望对你也有些帮助。一、基本语法语法说明bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。注意:1、表

php print 这个坑,遇到连接符从右往左执行

在使用php的时候,我很少用到print这个函数,哦,不对,这是一个语言结构,而并非日函数!看一段代码

C++入门:三、函数

这是我学习C++的第三篇笔记,函数。我的学习路径是现在学习的是函数的声明、定义、调用等相关知识。函数声明和定义函数的声明包含返回类型,函数名字,0个或者多个形参,无函数体,通常在头文件中对函数进行声明。函数的定义包含返回类型,函数名字,0个或多个形参,以及函数体。比如写一个求阶乘的函数,可以写成下面这样写一些简单的函数大多数语言都差不多,不过可惜每种语言或多或少都有自己的特色,这是比较令人头秃的地方。函数的参数函数可以带有0或多个参数,每个参数都需要声明类型。参数传递可以传值和传引用。如果形参是引用类型,那么它将绑定到对应的实参中,我们成为传引用。否则,将会把实参的值拷贝后赋值给形参,我们成为

Go入门:三、函数的声明和调用

这是我Go学习笔记的第三篇!接下来学习的是Go的函数声明和调用。我的语言学习过程一般分为下面几个:1. 变量和数据类型2. 流程控制方法3. 函数声明和调用4. 面向对象5. 语言特性6. 标准库函数声明func 函数名称(参数表) 返回值类型 { // 函数体}写一个函数是非常简单的,掌握语法格式就可以了。函数是一个功能的封装,能让函数体内的代码得到很好的复用。比如我要输出个人信息,我可以把个人信息封装到函数里面,后续直接调用这个函数而不是每次都print一堆信息了上面定义的函数没有参数,也没有返回值,非常简单的一个函数。如果我想让姓名可变,那么可以定义一个带有参数的函数接下来定义一个有

赞赏

微信赞赏支付宝赞赏

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注