`

[C++][STL] binary_search

    博客分类:
  • C++
 
阅读更多
所需的页眉
   <algorithm>
				
回到顶端
原型
   template<class ForwardIterator, class T> inline
       ForwardIterator upper_bound(ForwardIterator first,
                                   ForwardIterator last,
                                   const T& value)
				
注: 在原型中的类/参数名称与在头文件中的与原始版本不匹配。他们已被修改,以提高可读性。
回到顶端
说明
upper_bound 算法将最后一个位置返回序列中的序列的顺序进行维护,可以在插入值。 

upper_bound 返回迭代器放在该位置的值可将插入在范围 [第一次...最后一次),或如果没有此类位置存在,则返回上一次。 

upper_bound 假定范围 [第一次...最后一次) 进行排序使用运算符 <。
回到顶端
示例代码
////////////////////////////////////////////////////////////////////// 
// 
// Compile options needed: /GX
// 
// upper_bound.cpp : Illustrates how to use the upper_bound
//                   function.
// 
// Functions:
// 
//    upper_bound : Return the upper bound within a range.
// 
// Written by Kalindi Sanghrajka
// of Microsoft Product Support Services,
// Software Core Developer Support.
// Copyright (c) 1996 Microsoft Corporation. All rights reserved.
////////////////////////////////////////////////////////////////////// 

// disable warning C4786: symbol greater than 255 character,
// okay to ignore
#pragma warning(disable: 4786)

#include <iostream>
#include <algorithm>
#include <functional>
#include <vector>
using namespace std;

void main()
{
    const int VECTOR_SIZE = 8 ;

    // Define a template class vector of int
    typedef vector<int, allocator<int> > IntVector ;

    //Define an iterator for template class vector of strings
    typedef IntVector::iterator IntVectorIt ;

    IntVector Numbers(VECTOR_SIZE) ;

    IntVectorIt start, end, it, location ;

    // Initialize vector Numbers
    Numbers[0] = 4 ;
    Numbers[1] = 10;
    Numbers[2] = 10 ;
    Numbers[3] = 30 ;
    Numbers[4] = 69 ;
    Numbers[5] = 70 ;
    Numbers[6] = 96 ;
    Numbers[7] = 100;

    start = Numbers.begin() ;   // location of first
                                // element of Numbers

    end = Numbers.end() ;       // one past the location
                                // last element of Numbers

    // print content of Numbers
    cout << "Numbers { " ;
    for(it = start; it != end; it++)
        cout << *it << " " ;
    cout << " }\n" << endl ;

    //return the last location at which 10 can be inserted
    // in Numbers
    location = upper_bound(start, end, 10) ;

    cout << "Element 10 can be inserted at index "
        << location - start << endl ;
}
				
程序输出为:
Numbers { 4 10 10 30 69 70 96 100  }


Lower_bound 和 upper_bound的区别

lower_bound: the position that found is the first pos which value is not lower than compare value
upper_bound: the position that found is the first pos which value is larger than compare value
例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
 
int main()
{
  int A[] = { 1, 2, 3, 3, 3, 5, 8 };
  const int N = sizeof(A) / sizeof(int);
 
  for (int i = 1; i <= 10; ++i) {
    int * p = upper_bound(A, A + N, i);
    int * q = lower_bound(A,A+N,i);
    cout << "Searching for " << i << ".  "<<endl;
    cout << "upper_bound Result: index = " << p - A << ", "<<endl;
    cout << "lower_bound Result: index = " << q - A << ", "<<endl;
    if (p != A + N)
    {
      cout << "upper_bound A[" << p - A << "] == " << *p << endl;
      cout << "lower_bound A[" << q - A << "] == " << *q << endl;
    }
    else
      cout << "which is off-the-end." << endl;
    cout<<"--------------------------------"<<endl;
  }
  return 0;
}


 if (keyScopeItem.getEnableAggregation())
    {
        bool isMatch = false;
        ScopeStartEndValuesMap::const_iterator upperIter = keyScopeItem.getKeyScopeValues().upper_bound(keyScopeItem.getAggregateKeyValue());
        if ( upperIter != keyScopeItem.getKeyScopeValues().begin() )
        {
            --upperIter;
            
            if ( keyScopeItem.getAggregateKeyValue() >= upperIter->first 
            && keyScopeItem.getAggregateKeyValue() <=  upperIter->second )
            {
                isMatch = true;
            }
        }

        // will match...
        if ( isMatch )
        {
            eastl::string msg;
            msg.sprintf("[StatsConfigData].parseKeyScopeItem(): key scope item [%s] has non-unique aggregate key value [%"PRId64"]",
                keyScopeItemName, keyScopeItem.getAggregateKeyValue());
            TdfString& str = validationErrors.getErrorMessages().push_back();
            str.set(msg.c_str());
            return false;
        }
    }

分享到:
评论

相关推荐

    C++ STL程序员面试题

    - algorithm库中的常用算法,如binary_search、lower_bound、upper_bound用于有序容器的搜索。 3. **STL面试题.doc** 面试题可能包含各种实践问题,比如: - 如何使用STL实现高效的字符串反转? - 如何在不复制...

    SGISTL.rar_Boost_STL_STL手册_sgi stl

    同时,STL提供了诸如lower_bound、upper_bound和binary_search等二分查找算法,它们在有序容器中寻找元素时效率很高。 总的来说,了解和掌握SGI STL及其Boost增强版对于任何C++开发者来说都是必要的技能。通过阅读...

    c++ STL阐述了各种查找算法的异同以及使用他们的时机

    在 STL 中,binary_search 是一个非常重要的算法,它可以在对数时间内找到对象的位置。equal_range 是一个组合算法,它由 lower_bound 和 upper_bound 两个算法组成,可以找到所有等价元素的区间。 C++ STL 中的...

    C++STL手册.rar

    - **查找算法**:如 `find()`、`find_if()`、`lower_bound()`、`upper_bound()` 和 `binary_search()`。 - **交换和赋值算法**:如 `swap()`、`copy()` 和 `assign()`。 - **迭代器操作**:如 `advance()`、`next...

    stl.zip_C++_STL

    - **搜索算法**:`find` 查找第一个匹配的元素,`binary_search` 在有序容器中查找元素。 - **迭代器操作**:`advance` 移动迭代器,`next` 和 `prev` 分别向前和向后移动一个元素。 - **复制与移动**:`copy` 复制...

    C++ STL中文版 有目录

    例如,算法库中包含诸如排序(如sort、stable_sort)、搜索(如find、binary_search)和元素操作(如copy、swap)等。 4. 函数对象(Function Objects):在C++ STL中,函数对象是可以被当作参数传递给算法的任何...

    STL_C++标准程序库_侯杰_BIG5

    STL中的算法包括排序算法(如`sort`、`stable_sort`)、查找算法(如`find`、`binary_search`)、集合操作算法(如`unique`、`set_union`)以及变换和复制算法(如`transform`、`copy`)。这些算法大多数都具有泛型...

    C++STL基础及应用 源程序

    - **查找算法**:`find()`、`binary_search()` 在有序容器中查找元素。 - **交换和复制**:`swap()` 交换两个元素,`copy()` 将元素从一个容器复制到另一个容器。 - **集合操作**:`unique()` 删除重复元素,`merge...

    C++ STL 开发技术导引(第6章)

    21.11 重复元素子序列搜索search_n 299 21.12 最后一个子序列搜索find_end 301 21.13 本章小结 303 第22章 变易算法 304 22.1 元素复制copy 304 22.2 反向复制copy_backward 305 22.3 元素交换swap ...

    P246~250C++常用查找算法学习笔记.docx

    binary_search算法是C++ STL中的一种查找算法,用于查找容器中的指定元素是否存在。该算法的函数原型为`bool binary_search(iterator beg, iterator end, const T& value)`,其中`beg`和`end`分别表示容器的开始和...

    C++ STL标准程序库实例源代码

    - 包括排序算法(如`sort`)、查找算法(如`find`、`binary_search`)、复制算法(如`copy`)、交换和赋值算法等。 - 新的C++ 11/14标准引入了范围基础的for循环和算法,如`emplace`、`emplace_back`、`erase`等,...

    C++ stl算法汇总(C++程序员必备)

    4. `binary_search`:在已排序的序列中查找指定值,如果找到则返回true,可使用自定义比较函数。 5. `copy`:将一个序列的所有元素复制到另一个位置,保持原有顺序。 6. `copy_backward`:与`copy`相似,但元素...

    C++ STL开发技术导引(第5章)

    21.11 重复元素子序列搜索search_n 299 21.12 最后一个子序列搜索find_end 301 21.13 本章小结 303 第22章 变易算法 304 22.1 元素复制copy 304 22.2 反向复制copy_backward 305 22.3 元素交换swap ...

    c++ STL 库使用示例

    - **查找算法**:`find()`、`find_if()`、`binary_search()`等用于在序列中查找特定元素或满足条件的元素。 - **集合操作**:`set_union()`、`set_intersection()`、`set_difference()`和`set_symmetric_...

    C++STL中文教程

    STL提供了一套丰富的算法,例如for_each、count、find、sort、binary_search、merge等。 4. 函数对象:函数对象是可以像函数一样被调用的对象。在STL中,很多算法都需要函数对象作为参数,以便在数据处理过程中进行...

    5rgtttaxbio_C++_algorithms_

    2. **搜索算法**:`find()`、`find_if()`、`binary_search()`等用于在序列中查找特定值或满足特定条件的元素。 3. **迭代算法**:例如`for_each()`,允许我们对容器内的每个元素应用一个函数或操作。 4. **复制与...

    c++进阶(stl资源),非原创,配套b站(C++进阶之STL)教程

    - **搜索算法**:如`std::find`寻找特定元素,`std::binary_search`在已排序容器中查找元素。 - **迭代算法**:如`std::transform`将一个范围内的元素转换为另一个范围。 - **算法操作**:如`std::copy`复制一个...

    C++STL程序员开发指南.pdf

    STL提供了大量通用算法,如排序(`sort`)、搜索(`find`、`binary_search`)、合并(`merge`)、去除重复项(`unique`)、复制(`copy`)等,这些算法可以应用于任何类型的容器,无需关心其内部实现。 5. **函数...

    C++ STL开发技术导引(第3章)

    21.11 重复元素子序列搜索search_n 299 21.12 最后一个子序列搜索find_end 301 21.13 本章小结 303 第22章 变易算法 304 22.1 元素复制copy 304 22.2 反向复制copy_backward 305 22.3 元素交换swap ...

    C++_STL编程轻松入门

    - **查找算法**:如`find`、`binary_search`。 - **修改算法**:如`reverse`、`replace`。 - **数值算法**:如`accumulate`、`inner_product`。 #### 四、STL的应用案例 ##### 4.1 实例分析 假设我们需要处理一个...

Global site tag (gtag.js) - Google Analytics