lower_bound 和 upper_bound 是内置的二分查找函数。
lower_bound - 一个函数,以对数时间在排序数组中找到大于或等于给定值 k 的最小元素。
它以数组的边界和 k 的值作为参数。
返回指向找到的元素的迭代器,如果不存在这样的元素,则返回指向数组末尾(不包括在内)的迭代器。
您可以在文档中阅读更多内容。
upper_bound - 一个在对数时间内在排序数组中找到严格大于给定值 k 的最小元素的函数。
它以数组的边界和 k 的值作为参数。
返回指向找到的元素的迭代器,如果不存在这样的元素,则返回指向数组末尾(不包括在内)的迭代器。
您可以在文档中阅读更多内容。
值得澄清的是,由于上述随机访问集合中缺少迭代器,因此在集合或多重集合上使用这些函数在对数时间内不起作用。
但是,这些集合都有对应的内置方法(也就是说,你需要“通过一个点”来使用它们)。
例子:
矢量 a = { 0, 1, 3, 5, 7 };
vector::iterator 它;
it = lower_bound(a.begin(), a.end(), 4);
// *它== 5
it = lower_bound(a.begin(), a.end(), 5);
// *它== 5
it = lower_bound(a.begin(), a.end(), 8);
// 它 == a.end()
it = upper_bound(a.begin(), a.end(), 4);
// *它== 5
it = upper_bound(a.begin(), a.end(), 5);
// *它== 7
it = upper_bound(a.begin(), a.end(), -1);
// *它== 0
// 通过减去迭代器,你可以得到找到的元素的索引
int ind = lower_bound(a.begin(), a.end(), 4) - a.begin();
// 工业 == 3
// 需要对集合和类似集合使用方法而不是函数
设置 s{ 1, 3, 5 };
设置::迭代器坐下;
坐 = s.lower_bound(3);
// *坐 == 3
坐 = s.upper_bound(3);
// *坐 == 5