📅  最后修改于: 2023-12-03 15:23:22.212000             🧑  作者: Mango
在STL中,有序集一般指std::set和std::map。
std::set是一个按照元素排序的容器,由于其元素的唯一性,它主要用来实现集合操作。而std::map是一个关联容器,它将元素看作是一个键值对,可以根据键值进行快速查找。
在使用set和map时,经常需要查找某个元素的位置,这就需要用到upper_bound()和lower_bound()函数。本篇文章将会讲解如何在C++中为有序集实现这两个函数。
lower_bound()函数返回的是第一个大于等于目标元素的迭代器。我们可以通过指针运算来获取其实际位置。
下面是一个在有序集中查找第一个大于等于目标元素的位置的示例代码:
#include <iostream>
#include <set>
int main()
{
std::set<int> mySet = { 1, 3, 5, 7, 9 };
int target = 6;
auto it = mySet.lower_bound(target);
if (it != mySet.end())
{
std::cout << "The lower bound position of " << target
<< " in the set is " << std::distance(mySet.begin(), it)
<< std::endl;
}
else
{
std::cout << "The lower bound of " << target << " is not found in the set." << std::endl;
}
return 0;
}
输出:
The lower bound position of 6 in the set is 3
在上面的代码中,我们先定义了一个set集合mySet来存储数据,然后指定目标元素为6,使用lower_bound()函数查找。
如果它返回的迭代器不指向mySet.end(),说明目标元素在集合中存在,我们可以通过指针运算来计算目标元素的位置。
反之,如果lower_bound()函数返回了end(),说明目标元素在集合中不存在。
和lower_bound()函数不同,upper_bound()函数返回的是第一个大于目标元素的迭代器。同样,我们可以通过指针运算来获取实际位置。
下面是一个在有序集中查找第一个大于目标元素的位置的示例代码:
#include <iostream>
#include <set>
int main()
{
std::set<int> mySet = { 1, 3, 5, 7, 9 };
int target = 6;
auto it = mySet.upper_bound(target);
if (it != mySet.end())
{
std::cout << "The upper bound position of " << target
<< " in the set is " << std::distance(mySet.begin(), it)
<< std::endl;
}
else
{
std::cout << "The upper bound of " << target << " is not found in the set." << std::endl;
}
return 0;
}
输出:
The upper bound position of 6 in the set is 3
同样的,我们先定义了一个set集合mySet来存储数据,然后指定目标元素为6,使用upper_bound()函数查找。
如果它返回的迭代器不指向mySet.end(),说明存在第一个大于目标元素的元素,我们可以通过指针运算来计算其位置。
反之,如果upper_bound()函数返回了end(),说明目标元素是集合中的最大元素,并且不存在第一个大于它的元素。
在STL中,有序集的查找操作可以使用lower_bound()和upper_bound()函数,可以很方便地解决查找问题,提高我们的效率。