首页 > 编程语言 >C++学习随笔——C++STL中binary_search的使用方法

C++学习随笔——C++STL中binary_search的使用方法

时间:2024-08-28 10:05:21浏览次数:13  
标签:std binary search people C++ value include

std::binary_search 是 C++ 标准模板库 (STL) 中的一个算法,用于在有序范围内查找某个值是否存在。它基于二分查找算法,时间复杂度为 O(log n)

std::binary_search 的基本用法:

  bool binary_search(ForwardIterator first, ForwardIterator last, const T& value);

  • first: 指向范围的起始迭代器。
  • last: 指向范围的结束迭代器。
  • value: 要查找的值。

示例代码:

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

int main() {
    // 创建并排序一个整数向量
    std::vector<int> vec = {1, 3, 5, 7, 9, 11};
    
    // 查找一个存在的元素
    int value_to_find = 5;
    bool found = std::binary_search(vec.begin(), vec.end(), value_to_find);
    
    if (found) {
        std::cout << value_to_find << " found in the vector." << std::endl;
    } else {
        std::cout << value_to_find << " not found in the vector." << std::endl;
    }
    
    // 查找一个不存在的元素
    value_to_find = 6;
    found = std::binary_search(vec.begin(), vec.end(), value_to_find);
    
    if (found) {
        std::cout << value_to_find << " found in the vector." << std::endl;
    } else {
        std::cout << value_to_find << " not found in the vector." << std::endl;
    }

    return 0;
}

 

带有比较函数的 std::binary_search

bool binary_search(ForwardIterator first, ForwardIterator last, const T& value, Compare comp);

示例代码:

带有比较函数的 std::binary_search
 #include <iostream>
#include <algorithm>
#include <vector>

struct Person {
    std::string name;
    int age;

    // 定义小于操作符以按年龄排序
    bool operator<(const Person& other) const {
        return age < other.age;
    }
};

int main() {
    std::vector<Person> people = {
        {"Alice", 30},
        {"Bob", 25},
        {"Charlie", 35}
    };
    
    // 对 people 按年龄排序
    std::sort(people.begin(), people.end());

    Person target = {"", 25}; // 只关心年龄,不关心名字

    // 使用自定义比较函数进行二分查找
    bool found = std::binary_search(people.begin(), people.end(), target, [](const Person& p1, const Person& p2) {
        return p1.age < p2.age;
    });
    
    if (found) {
        std::cout << "Person with age " << target.age << " found in the vector." << std::endl;
    } else {
        std::cout << "Person with age " << target.age << " not found in the vector." << std::endl;
    }

    return 0;
}

 

注意事项

  • 有序性要求std::binary_search 假定输入范围已经按照升序排序。如果数据没有排序,可能会得到错误的结果或无效的返回值。
  • 查找多个相等的元素:如果范围中有多个与 value 相等的元素,std::binary_search 只会返回 truefalse,而不会告诉你元素的具体位置或数量。

std::binary_search 非常适合用于快速检测一个有序序列中是否存在某个元素。如果需要找到元素的具体位置,可以使用 std::lower_boundstd::upper_bound

 

标签:std,binary,search,people,C++,value,include
From: https://www.cnblogs.com/kitanoki/p/18384029

相关文章

  • C++学习随笔——什么是迭代器
    迭代器是C++标准模板库(STL)中用于遍历容器元素的对象或概念。它们提供了一种通用的方式来访问容器中的元素,而不需要了解容器的底层实现。迭代器在设计上类似于指针,但功能更为强大和灵活。 1.迭代器是什么?迭代器是一个抽象概念,它为容器(如vector、list等)提供了一种统......
  • QT/C++中的GDAL多线程应用(读取):发生的问题以及解决方案
    1.引言在使用GDAL库对TIF文件进行切割和创建瓦片金字塔时,为了提高创建效率,不得不考虑使用多线程处理。然而,在实际实现过程中,我遇到了许多问题。通过不断的尝试和优化,最终找到了有效的解决方案。本文将详细记录这一过程中的问题和解决方法。2.初始多线程尝试与问题2.1......
  • 南沙C++陈老师讲题:1078:求分数序列和
    ​【题目描述】【输入】输入有一行,包含一个正整数n(n≤30)n(n≤30)。【输出】输出有一行,包含一个浮点数,表示分数序列前nn项的和,精确到小数点后44位。【输入样例】2【输出样例】3.5000#include<iostream>#include<stdio.h>usingnamespacestd;intmain()......
  • 二叉树的层序遍历 C++
    给你二叉树的根节点 root ,返回其节点值的 层序遍历 。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]classSolution{public:vector<vect......
  • 根据二叉树创建字符串 C++
    给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例1:输入:root=[1,2,3,4]输出:"1......
  • C++智能指针
    1.为什么需要智能指针大家来看下面这段程序我们new了两个arraydoubleDivision(inta,intb){ //当b==0时抛出异常 if(b==0) { throw"Divisionbyzerocondition!"; } return(double)a/(double)b;}voidFunc(){ int*array1=newint[10]; int*......
  • C++面向对象三大特性之一(封装)
    下面这篇文我来给大家分享C++面向对象三大特性之一(封装)。一、什么是封装?分装就是一个类中的私有成员,虽然类外不可以访问,但是我们提供一些公共的接口来间接让其他人访问到,例如一个人的名字我们起好之后就一般不会允许其他人改你的姓名,但是我们可以通过一些方式得到你的姓名......
  • C++/C区别
    C++/C差别typedef和using的差别,typedef可以用来定义一个类型,也可以用于定义别名。using还是做不到定义类型,但是可以用于别名。voidAadd(){/*code*/}voidBadd(){/*code*/}typedefvoid(*PFunc)();//定义一个函数指针类型PFuncfunc=Aadd;PFuncfu......
  • 链表简介c++
    定义:链表是一种数据结构,其中元素(也称为节点)不是连续存储的。每个节点包含数据部分和一个指向下一个节点的指针。类型:在C++中,有两种主要类型的链表:单链表(每个节点只有一个指针指向下一个节点)和双向链表(每个节点有两个指针,一个指向前一个节点,另一个指向后一个节点)。结构......
  • C++实现的最短路径问题
    最短路径问题最短路径问题是图论中的一个经典问题,旨在寻找从一个起点到一个终点的最短路径。最常见的算法包括Dijkstra算法、Bellman-Ford算法和Floyd-Warshall算法。这些算法被广泛用于导航系统、网络路由等领域。问题描述输入:一个加权图,表示图中各节点之间的连接和权......