📅  最后修改于: 2023-12-03 15:36:35.401000             🧑  作者: Mango
在C++中,STL(标准模板库)提供了许多实用的数据结构和算法,包括排序和查找。如果我们想要查找排序后的数组的底面和天花板,可以使用STL中的lower_bound和upper_bound算法。
注意:lower_bound和upper_bound均要求输入的数组必须是已排序的。
具体使用方法如下:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int a[] = {1,2,2,2,3,4,5,5,6};
vector<int> v(a,a+sizeof(a)/sizeof(int));
// 底面
vector<int>::iterator it_low = lower_bound(v.begin(), v.end(), 2);
int index_low = it_low - v.begin();
cout << "底面位置:" << index_low << endl;
// 天花板
vector<int>::iterator it_up = upper_bound(v.begin(), v.end(), 2);
int index_up = it_up - v.begin();
cout << "天花板位置:" << index_up << endl;
return 0;
}
输出结果为:
底面位置:1
天花板位置:4
以上代码中,使用了vector作为存储容器,可以方便地使用迭代器求出元素位置。lower_bound和upper_bound均接收两个迭代器作为参数,分别表示查找的起始和结束位置。注意在求得迭代器之后,需使用迭代器之间的距离求出元素的位置。
下面是一个实际应用的示例,给出一个已排序的数组,求出一个数的底面和天花板位置。如果该数不存在于数组中,输出-1。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int a[] = {1,2,2,2,3,4,5,5,6};
vector<int> v(a,a+sizeof(a)/sizeof(int));
int x = 2;
// 底面
vector<int>::iterator it_low = lower_bound(v.begin(), v.end(), x);
int index_low = it_low - v.begin();
if (index_low == v.size() || v[index_low] != x)
index_low = -1;
// 天花板
vector<int>::iterator it_up = upper_bound(v.begin(), v.end(), x);
int index_up = it_up - v.begin();
if (index_up == 0 || v[index_up-1] != x)
index_up = -1;
cout << "底面位置:" << index_low << endl;
cout << "天花板位置:" << index_up << endl;
return 0;
}
如果将x的值改为7,将输出-1。