📌  相关文章
📜  在C++中成对列表中lower_bound()和upper_bound()的实现(1)

📅  最后修改于: 2023-12-03 15:07:52.528000             🧑  作者: Mango

在C++中成对列表中lower_bound()和upper_bound()的实现

成对列表是指将两个值存储为一对,如(key, value),并按照key进行排序的列表。C++标准库中提供了两个非常有用的函数来处理成对列表中的keylower_bound()upper_bound()

下面将详细介绍这两个函数的实现及其使用方法:

lower_bound()函数

lower_bound()函数用于在成对列表中查找某个key的下限。

以下为示例代码:

template <typename ForwardIterator, typename T>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const T& value) {
    while (first != last) {
        auto mid = next(first, distance(first, last) / 2);
        if (mid->first < value) {
            first = next(mid);
        } else {
            last = mid;
        }
    }
    return first;
}

函数接受三个参数:

  1. first - 成对列表中的起始迭代器。
  2. last - 成对列表中的结束迭代器。
  3. value - 要查找的key的值。

函数首先计算中间位置,然后将其与查找值进行比较。如果中间位置的key小于查找值,则将查找区间缩小为中间位置之后的部分;否则将查找区间缩小为中间位置之前的部分。重复这个过程,直到查找到最终的下限位置。

以下为使用示例:

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

using namespace std;

int main() {
    vector<pair<int, int>> v {{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}};
    auto it = lower_bound(v.begin(), v.end(), make_pair(5, 0));
    cout << "lower_bound: " << it->first << " " << it->second << endl;
    return 0;
}

执行结果如下:

lower_bound: 5 6

从结果可以看出,函数返回的迭代器指向了key为5的位置,这是查找到的下限位置。

upper_bound()函数

upper_bound()函数用于在成对列表中查找某个key的上限。

以下为示例代码:

template <typename ForwardIterator, typename T>
ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last, const T& value) {
    while (first != last) {
        auto mid = next(first, distance(first, last) / 2);
        if (value < mid->first) {
            last = mid;
        } else {
            first = next(mid);
        }
    }
    return first;
}

函数接受的参数与lower_bound()相同。

函数的实现与lower_bound()略有不同。如果中间位置的key大于查找值,则将查找区间缩小为中间位置之前的部分;否则将查找区间缩小为中间位置之后的部分。重复这个过程,直到查找到最终的上限位置。

以下为使用示例:

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

using namespace std;

int main() {
    vector<pair<int, int>> v {{1, 2}, {3, 4}, {5, 6}, {7, 8}, {9, 10}};
    auto it = upper_bound(v.begin(), v.end(), make_pair(5, 0));
    cout << "upper_bound: " << it->first << " " << it->second << endl;
    return 0;
}

执行结果如下:

upper_bound: 7 8

从结果可以看出,函数返回的迭代器指向了key为7的位置,这是查找到的上限位置。

总结

lower_bound()upper_bound()是非常有用的C++标准库函数,它们可以很方便地对成对列表中的key进行查找和处理。对于需要在成对列表中查找上下界的问题,这两个函数可以大大提高程序的效率。