算法(Algorithm)为一个计算的具体步骤,常用于计算、数据处理和自动推理。C++ 算法库(Algorithms library)为 C++ 程序提供了大量可以用来对容器及其它序列进行算法操作的函数。这些组件可以为函数或函数模板,大部份由头文件 <algorithm> 提供,一小部份位于 <numeric>、<cstdlib> 中。
在涉及范围操作时,需要注意的是:通常 C++ 中提及的范围(如:[first, last))都是半闭半开区间,即第二个迭代器(或指针,本例中为 last)指向的元素是不包含在范围中的。
还可以参考 vector与法算 主题,该主题包含大量的代码示例。
二分法查找操作:
binary_search | 判断范围中是否存在值等价于给定值的元素 |
equal_range | 返回范围中值等于给定值的元素组成的子范围 |
lower_bound | 返回指向范围中第一个值大于或等于给定值的元素的迭代器 |
upper_bound | 返回指向范围中第一个值大于给定值的元素的迭代器 |
binary_search
判断范围中是否存在值等价于给定值的元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | // binary_search example #include <iostream> // std::cout #include <algorithm> // std::binary_search, std::sort #include <vector> // std::vector bool myfunction ( int i, int j) { return (i<j); } int main () { std::cout << “looking for a 3… “; // using myfunction as comp: std::cout << “looking for a 6… “; return 0; |
输出:
1 2 | looking for a 3… found! looking for a 6… not found. |
equal_range
返回范围中值等于给定值的元素组成的子范围
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | // equal_range example #include <iostream> // std::cout #include <algorithm> // std::equal_range, std::sort #include <vector> // std::vector bool mygreater ( int i, int j) { return (i>j); } int main () { // using default comparison: return 0; |
输出:
1 | bounds at positions 2 and 5 |
lower_bound
返回指向范围中第一个值大于或等于给定值的元素的迭代器
upper_bound
返回指向范围中第一个值大于给定值的元素的迭代器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | // lower_bound/upper_bound example #include <iostream> // std::cout #include <algorithm> // std::lower_bound, std::upper_bound, std::sort #include <vector> // std::vector int main () { int myints[] = { 10, 20, 30, 30, 20, 10, 10, 20}; std::vector< int> v(myints,myints+ 8); // 10 20 30 30 20 10 10 20 std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30 std::vector< int>::iterator low,up; low=std::lower_bound (v.begin(), v.end(), 20); // ^ up= std::upper_bound (v.begin(), v.end(), 20); // ^ std::cout << “lower_bound at position “ << (low- v.begin()) << ‘\n’; std::cout << “upper_bound at position “ << (up – v.begin()) << ‘\n’; return 0; |
输出:
1 2 | lower_bound at position 3 upper_bound at position 6 |
注:函数的中文释义来自:http://classfoo.cn/cpp/head/76573_319/
注:例子来自:http://www.cplusplus.com/reference/algorithm/