C++ STL 界限函数

  c++提供一类STL函数来实现对数组中元素的检索,其中较为简单且应用较广的是binary_search,upper_bound和lower_bound,它们都被包含在头文件#include<algorithm>中,用法如下:

//STL
//lower_bound与upper_bound
#include<iostream>
#include<algorithm>//包含这两个界限函数的头文件
#include<cstdio>
using namespace std;
int a[]={0,4,4,11,30,69,70,96,100},n=8,m,x,y,z,w;
void find_lower_bound(int aim)
{
    int x=1,y=n,m;
    while(x<y)
    {
        int m=x+(y-x)/2;
        if(a[m]>=aim) y=m;
        else x=m+1;
    }
    printf("\nlower_bound:%d",x);//因为最后x=y,所以输出x和输出y是一样的
}
void find_upper_bound(int aim)
{
    int x=1,y=n,m;
    while(x<y)
    {
        int m=x+(y-x)/2;
        if(a[m]<=aim) x=m+1;
        else y=m;
    }
    printf("\nupper_bound:%d",x);//同上
}
int main()
{
//    std::ios::sync_with_stdio(false);//这句话用来加快cin和cout的速度,但使用后cin,cout不能与scanf,printf混用,所以慎用
//    cin>>n;
//    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
//    sort(a+1,a+n+1);
//    cin>>m;
    x=lower_bound(a,a+n,3)-a;//要注意写法
    y=upper_bound(a,a+n,4)-a;
    z=binary_search(a,a+n,11);//判断是否存在,是返回真值
    w=binary_search(a,a+n,3);//不存在则返回假值
    printf("%d %d %d %d ",x,y,z,w);
    find_lower_bound(3);//函数原型
    find_upper_bound(4);//函数原型
    return 0;
}
  这里的函数原型其实是二分算法,注意两个函数的区别在于当a[m]=aim时到底是向前缩短区间还是向后缩短区间,这关系到最后x的取值。

时间: 2024-10-21 18:55:27

C++ STL 界限函数的相关文章

C++STL 常用 函数 用法

学完c++快一年了,感觉很有遗憾,因为一直没有感觉到c++的强大之处,当时最大的感觉就是这个东西的输入输出比C语言要简单好写. 后来我发现了qt,opencv,opengl,原来,c++好玩的狠. 在这些图形库之外,最常用的可能就是STL,这个东西由于当时学c++的时候迷迷糊糊,完全是一头雾水,上学期数据结构之后开始有点儿开窍了,现在把才c++STL中常用的函数,用法贴一下,也是记录一下,希望能给一样迷糊的盆友们一些帮助. 整理自<ACM程序设计> 迭代器(iterator) 个人理解就是把所

STL sort()函数

C++之所以得到这么多人的喜欢,是因为它既具有面向对象的概念,又保持了C语言高效的特点.STL 排序算法同样需要保持高效.因此,对于不同的需求,STL提供的不同的函数,不同的函数,实现的算法又不尽相同. 1.1 所有sort算法介绍 所有的sort算法的参数都需要输入一个范围,[begin, end).这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator), 也就是说可以随机访问的迭代器,如:it+n什么的.(partition 和stable_parti

STL sort函数的用法

sort在STL库中是排序函数,有时冒泡.选择等O(N^2)算法会超时时,我们可以使用STL中的快速排序O(N log N)完成排序 sort在<algorithm>库里面,原型如下: template <class RandomAccessIterator> void sort ( RandomAccessIterator first, RandomAccessIterator last ); template <class RandomAccessIterator, cl

C++ STL next_permutation函数

在STL中,除了next_permutation外,还有一个函数prev_permutation,两者都是用来计算排列组合的函数.前者是求出下一个排列组合,而后者是求出上一个排列组合.所谓"下一个"和"上一个",书中举了一个简单的例子:对序列 {a, b, c},每一个元素都比后面的小,按照字典序列,固定a之后,a比bc都小,c比b大,它的下一个序列即为{a, c, b},而{a, c, b}的上一个序列即为{a, b, c},同理可以推出所有的六个序列为:{a,

c++ stl bind函数介绍

/* stl::bind 使用 */ #include <iostream> #include <string> #include <functional> /* 知识补充: std::bind绑定器 将函数.成员函数和闭包转成function函数对象 将多元(n>1)函数转成一元函数或者(n-1)元函数. bind()接受一个函数(或者函数对象,或者任何你可以通过"(...)"符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新

C++ STL 全排列函数详解

一.概念 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列.当m=n时所有的排列情况叫全排列.如果这组数有n个,那么全排列数为n!个. 比如a,b,c的全排列一共有3!= 6 种 分别是{a, b, c}.{a, c, b}.{b, a, c}.{b, c, a}.{c, a, b}.{c, b, a}. 二.常用操作 1.头文件 #include <algorithm> 2.使用方法 这里先说两个概念:"下一个排列组合&qu

YXXYUPO0C++STL算法函数总结

容器自己定义了的算法vector:swaplist:swap,merge,splice,remove,remove_if,reverse,uniquedeque:swapmap,set,multiset,multimap:find,count,lower_bound,upper_bound,equal_bound(返回pair<lower_bound,upper_bound>) all_ofany_ofnone_offor_eachfind(it.b,it.e,val)find_iffind_

C++ STL replace()函数常用用法详解

replace算法: replace函数包含于头文件#include<string>中. 泛型算法replace把队列中与给定值相等的所有值替换为另一个值,整个队列都被扫描,即此算法的各个版本都在 线性时间内执行---其复杂度为O(n). 即replace的执行要遍历由区间[frist,last)限定的整个队列,以把old_value替换成new_value. 下面介绍replace()函数常用的九中方法: 用法一: 用str替换指定字符串从起始位置pos开始长度为len的字符 示例代码: #

(C++)STL排序函数sort和qsort的用法与区别

主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 功 能: 使用快速排序例程进行排序 参 数: 1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 说 明:qsort函数是ANSI C标准中提供的,其