SGI

equal_range

类别:算法 组件类型:函数

原型

Equal_range是一个重载名称;实际上有两个equal_range函数。
template <class ForwardIterator, class LessThanComparable>
pair<ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last,
            const LessThanComparable& value);

template <class ForwardIterator, class T, class StrictWeakOrdering>
pair<ForwardIterator, ForwardIterator>
equal_range(ForwardIterator first, ForwardIterator last, const T& value,
            StrictWeakOrdering comp);

描述

Equal_range是二分查找的一个版本:它试图在有序范围内找到元素在有序范围内[first, last) [1]。返回值为equal_range本质上是lower_boundupper_bound返回值的组合:它返回一对迭代器ij使得i是第一个可以插入而不破坏排序的位置,并且j是最后一个可以插入而不破坏排序的位置。因此,范围内的每个元素[i, j)都等价于 [1],并且[i, j)[first, last)具有此属性的最大子范围。 的第一个版本使用equal_range使用operator<进行比较,第二个版本使用 函数对象comp.

的第一个版本equal_range返回一对迭代器[i, j). i[first, last)中满足以下条件的最远迭代器:对于k中的每个迭代器[first, i), *k < value. j[first, last)中满足以下条件的最远迭代器:对于k中的每个迭代器[first, j), value < *kfalse。对于每个迭代器k中的每个迭代器[i, j),既不value < *k也不*k < valuetrue. [2]

的第二个版本equal_range返回一对迭代器[i, j). i[first, last)中满足以下条件的最远迭代器:对于k中的每个迭代器[first, i), comp(*k, value)true. j[first, last)中满足以下条件的最远迭代器:对于k中的每个迭代器[first, j), comp(value, *k)false。对于每个迭代器k中的每个迭代器[i, j),既不comp(value, *k)也不comp(*k, value)true. [2]

定义

在标准头文件 algorithm 和非标准向后兼容头文件 algo.h 中定义。

类型要求

对于第一个版本对于第二个版本

先决条件

对于第一个版本对于第二个版本

复杂度

比较次数是对数的:最多2 * log(last - first) + 1。如果ForwardIterator随机访问迭代器,则遍历范围的步数也是对数的;否则,步数与last - first. [3]

成正比

int main()
{
  int A[] = { 1, 2, 3, 3, 3, 5, 8 };
  const int N = sizeof(A) / sizeof(int);

  for (int i = 2; i <= 4; ++i) {
    pair<int*, int*> result = equal_range(A, A + N, i);

    cout << endl;
    cout << "Searching for " << i << endl;
    cout << "  First position where " << i << " could be inserted: "
         << result.first - A << endl;
    cout << "  Last position where " << i << " could be inserted: "
         << result.second - A << endl;
    if (result.first < A + N)
      cout << "  *result.first = " << *result.first << endl;
    if (result.second < A + N)
      cout << "  *result.second = " << *result.second << endl;
  }
}    
示例
Searching for 2
  First position where 2 could be inserted: 1
  Last position where 2 could be inserted: 2
  *result.first = 2
  *result.second = 3

Searching for 3
  First position where 3 could be inserted: 2
  Last position where 3 could be inserted: 5
  *result.first = 3
  *result.second = 5

Searching for 4
  First position where 4 could be inserted: 5
  Last position where 4 could be inserted: 5
  *result.first = 5
  *result.second = 5

输出为

注释xy使得x < y, x > y,并且x == y都为false。(请参阅 小于可比较 要求以了解更多信息。)因此,在范围内查找在范围内[first, last),并不意味着找到一个等于的元素,而是找到一个等价于的元素:一个既不大于也不小于的元素。但是,如果您使用的是全序(例如,如果您使用的是strcmp,或者如果您对整数使用普通的算术比较),那么您可以忽略此技术上的区别:对于全序,相等和等价是相同的。

[2] 请注意,equal_range可能会返回一个空范围;也就是说,它可能返回一对元素,这两个元素都是相同的迭代器。Equal_range当且仅当范围[first, last)不包含与等价的元素时,才会返回空范围。可以插入而不违反范围排序的位置只有一个,因此返回值是一对元素,这两个元素都是指向该位置的迭代器。

[3] 随机访问迭代器前向迭代器 之间的这种差异仅仅是因为advance对于 随机访问迭代器 是常数时间,对于 前向迭代器 是线性时间。

另请参阅

lower_bound, upper_bound, binary_search
[Silicon Surf] [STL Home]
Copyright © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息