📜  使用C++ STL查找排序后的数组的底面和天花板(1)

📅  最后修改于: 2023-12-03 15:36:35.401000             🧑  作者: Mango

使用C++ STL查找排序后的数组的底面和天花板

在C++中,STL(标准模板库)提供了许多实用的数据结构和算法,包括排序和查找。如果我们想要查找排序后的数组的底面和天花板,可以使用STL中的lower_bound和upper_bound算法。

lower_bound和upper_bound的基本用法
  • 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。