iter=data.erase(iter);删掉

转载:http://www.cnblogs.com/cobbliu/archive/2012/05/21/2512249.html

STL中的每个算法都非常精妙,接下来的几天我想集中学习一下STL中的算法。



  ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一个非递减序列[first, last)中的第一个大于等于值val的位置。

     ForwardIter upper_bound(ForwardIter first, ForwardIter last, const _Tp& val)算法返回一个非递减序列[first, last)中第一个大于val的位置。

1, lower_bound

  这个序列中可能会有很多重复的元素,也可能所有的元素都相同,为了充分考虑这种边界条件,STL中的lower_bound算法总体上是才用了二分查找的方法,但是由于是查找序列中的第一个出现的值大于等于val的位置,所以算法要在二分查找的基础上做一些细微的改动。

     首先是我修改数据结构课本上的二分查找实现的lower_bound算法:





int my_lower_bound(int *array, int size, int key)

{

    int first = 0, last = size-1;

    int middle, pos=0;       //需要用pos记录第一个大于等于key的元素位置





    while(first < last)

    {

        middle = (first+last)/2;

        if(array[middle] < key){      //若中位数的值小于key的值,我们要在右边子序列中查找,这时候pos可能是右边子序列的第一个

            first = middle + 1;

            pos = first;

        }

        else{

            last = middle;           //若中位数的值大于等于key,我们要在左边子序列查找,但有可能middle处就是最终位置,所以我们不移动last,

            pos = last;              //而是让first不断逼近last。

        }

    }

    return pos;

}





  STL中的实现比较精巧,下面贴出源代码:





//这个算法中,first是最终要返回的位置

int lower_bound(int *array, int size, int key)

{

    int first = 0, middle;

    int half, len;

    len = size;





    while(len > 0) {

        half = len >> 1;

        middle = first + half;

        if(array[middle] < key) {     

            first = middle + 1;          

            len = len-half-1;       //在右边子序列中查找

        }

        else

            len = half;            //在左边子序列(包含middle)中查找

    }

    return first;

}





2, upper_bound





upper_bound返回的是最后一个大于等于val的位置,也是有一个新元素val进来时的插入位置。





我依然将二分查找略做修改:





int my_upper_bound(int *array, int size, int key)

{

    int first = 0, last = size-1;

    int middle, pos = 0;





    while(first < last)

    {

        middle = (first+last)/2;

        if(array[middle] > key){     //当中位数大于key时,last不动,让first不断逼近last

            last = middle;

            pos = last;

        }

        else{

            first = middle + 1;     //当中位数小于等于key时,将first递增,并记录新的位置

            pos = first;

        }

    }

    return pos;

}





下面的代码是STL中的upper_bound实现:

int upper_bound(int *array, int size, int key)

{

    int first = 0, len = size-1;

    int half, middle;





    while(len > 0){

        half = len >> 1;

        middle = first + half;

        if(array[middle] > key)     //中位数大于key,在包含last的左半边序列中查找。

            len = half;

        else{

            first = middle + 1;    //中位数小于等于key,在右半边序列中查找。

            len = len - half - 1;

        }

    }

    return first;

}

stl lower_bound()和up_bound()的更多相关文章

  1. [STL] lower_bound和upper_bound

    STL中的每个算法都非常精妙, ForwardIter lower_bound(ForwardIter first, ForwardIter last,const _Tp& val)算法返回一 ...

  2. STL lower_bound upper_bound binary-search

    STL中的二分查找——lower_bound .upper_bound .binary_search 二分查找很简单,原理就不说了.STL中关于二分查找的函数有三个lower_bound .upper ...

  3. stl lower_bound upper_bound binary_search equal_range

    自己按照stl实现了一个:   http://www.cplusplus.com/reference/algorithm/binary_search/ 这里有个注释,如何判断两个元素相同: Two e ...

  4. 鬼知道是啥系列之——STL(lower_bound(),upper_bound() )

    引子,不明觉厉:   百度,渐入佳境: 头铁,入门到放弃: lower_bound(): 头文件:  #include<algorithm>函数功能:  函数lower_bound()在f ...

  5. C++ STL lower_bound()和upper_bound()

    lower_bound()和upper_bound()用法 1.在数组上的用法 假设a是一个递增数组,n是数组长度,则 lower_bound(a, a+n, x):返回数组a[0]~a[n-1]中, ...

  6. stl lower_bound()返回值

    http://blog.csdn.net/niushuai666/article/details/6734403 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回 ...

  7. [STL]lower_bound&upper_bound

    源码 lower_bound template <class ForwardIterator, class T> ForwardIterator lower_bound (ForwardI ...

  8. STL lower_bound upper_bound 用法

    1.lower_bound(begin,end,x) 返回第一个>=x的位置,找不到return .end() 2.upper_bound (begin,end,x) 返回第一个>x的位置 ...

  9. STL库学习笔记(待补充QAQ

    几百年前就说要学STL了然后现在还没动呢QAQ总算还是克服了懒癌决定学下QAQ 首先港下有哪几个vector listset map stack queue,大概就这些? 然后因为有几个基本操作每个都 ...

随机推荐

  1. Xcode配置SVN详细步骤

    转载:http://blog.csdn.net/weiqubo/article/details/8288635   Xcode 默认自带Git 与 SVN,我们本篇介绍SVN的详细配置步骤如下: 1. ...

  2. Codeforces Round #138 (Div. 1)

    A 记得以前做过 当时好像没做对 就是找个子串 满足括号的匹配 []最多的 开两个栈模拟 标记下就行 #include <iostream> #include<cstring> ...

  3. c# -反射 初见

    反射是一个很强大的功能,不过好像有些消耗性能,大家慎重使用. 1.反射是干什么的? 通过反射,我们可与获取程序集中的原数据. 1.什么是程序集? dll.exe  这些将很多能实现具体功能的代码封装起 ...

  4. ASP.NET Core MVC使用MessagePack配合前端fetch交换数据

    1.安装Nuget包 - WebApiContrib.Core.Formatter.MessagePack https://www.nuget.org/packages/WebApiContrib.C ...

  5. 轻松搞懂Java中的自旋锁

    前言 在之前的文章<一文彻底搞懂面试中常问的各种“锁”>中介绍了Java中的各种“锁”,可能对于不是很了解这些概念的同学来说会觉得有点绕,所以我决定拆分出来,逐步详细的介绍一下这些锁的来龙 ...

  6. AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式

    1.Java中过滤出字母.数字和中文的正则表达式 (1)过滤出字母的正则表达式      [^(A-Za-z)] (2) 过滤出 数字 的正则表达式   [^(0-9)] (3) 过滤出 中文 的正则 ...

  7. windows系统同时安装多个nodejs环境(一键切换)

    由于不同程序对nodejs的环境要求不同,从而导致在单台电脑上开发多个nodejs应用很烦人: 好在gnvm,这个家伙帮我解决了问题 官网: https://github.com/kenshin/gn ...

  8. HTML5应用缓存与Web Workers

    1.什么是应用程序缓存      HTML5引入了应用程序缓存,这意味着web应用可进行缓存,并可在没有因特网链接时进行访问. 2.应用缓存的优势      离线浏览   用户可在应用离线时使用它们 ...

  9. U9249 【模板】BSGS

    题目描述 给定a,b,p,求最小的非负整数x 满足a^x≡b(mod p) 若无解 请输出“orz” 输入输出格式 输入格式: 三个整数,分别为a,b,p 输出格式: 满足条件的非负整数x 输入输出样 ...

  10. CCF|最小差值|Java

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...