1. binary_search
binary_search
函数用于判断一个元素是否存在于已排序的范围内。其原型如下:
bool binary_search( ForwardIt first, ForwardIt last, const T& value );
其中,first
和last
是范围的首尾迭代器,value
是要查找的元素。如果找到value
,则返回true
;否则返回false
。这个函数只告诉你元素是否存在,但不返回元素的位置。
2. lower_bound
lower_bound
函数用于查找第一个不小于给定值的元素。其原型如下:
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
如果范围内存在value
,则返回指向第一个value
的迭代器;如果不存在,则返回指向第一个大于value
的元素的迭代器(如果所有元素都小于value
,则返回last
)。这个函数返回的迭代器可以用来获取元素的位置(通过减去范围的起始迭代器)。
此外,由于 lower_bound
依赖于序列的排序,因此在使用之前,必须确保序列是已排序的。如果序列未排序,则 lower_bound
的结果将是未定义的。
最后,由于 lower_bound
返回的是一个迭代器,因此你可以通过减去 a.begin()
来计算找到的元素在序列中的位置(索引),但请注意,如果 lower_bound
返回的是 a.end()
,则这种计算可能会导致未定义的行为(因为它实际上是在计算一个越界的索引)。在大多数情况下,你应该检查返回值是否等于 a.end()
,以确定是否找到了元素。
3. upper_bound
upper_bound
函数用于查找第一个大于给定值的元素。其原型与lower_bound
相同。
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );
如果范围内存在value
,则返回指向第一个大于value
的元素的迭代器;如果不存在,则返回的结果与lower_bound
在不存在value
时相同。这个函数同样可以用来获取元素的位置(通过减去范围的起始迭代器),但它是查找大于给定值的第一个元素。
示例代码
以下是使用这些STL函数的示例代码:
#include <iostream>
#include <vector>
#include <algorithm> // 包含binary_search, lower_bound, upper_bound int main() { std::vector<int> nums = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}; int target = 7; // 使用binary_search if (std::binary_search(nums.begin(), nums.end(), target)) { std::cout << "元素 " << target << " 存在于数组中" << std::endl; } else { std::cout << "元素 " << target << " 不存在于数组中" << std::endl; } // 使用lower_bound auto it = std::lower_bound(nums.begin(), nums.end(), target); if (it != nums.end() && *it == target) { std::cout << "元素 " << target << " 的位置是 " << std::distance(nums.begin(), it) << std::endl; } else if (it != nums.end()) { std::cout << "第一个不小于 " << target << " 的元素是 " << *it << ",位置是 " << std::distance(nums.begin(), it) << std::endl; } else { std::cout << "所有元素都小于 " << target << std::endl; } // 使用upper_bound it = std::upper_bound(nums.begin(), nums.end(), target); std::cout << "第一个大于 " << target << " 的元素是 " << (it != nums.end() ? *it : "无") << std::endl; return 0;
}
这些STL函数大大简化了二分查找的实现,并且由于它们是库函数,通常经过了优化,因此在性能上也是很好的。