📅  最后修改于: 2023-12-03 15:07:52.528000             🧑  作者: Mango
成对列表是指将两个值存储为一对,如(key, value)
,并按照key
进行排序的列表。C++标准库中提供了两个非常有用的函数来处理成对列表中的key
:lower_bound()
和upper_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;
}
函数接受三个参数:
first
- 成对列表中的起始迭代器。last
- 成对列表中的结束迭代器。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()
函数用于在成对列表中查找某个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
进行查找和处理。对于需要在成对列表中查找上下界的问题,这两个函数可以大大提高程序的效率。