C++ STL中multiset equal_range()函数
在C++ STL中,multiset
是一个内置的支持自动排序和自动去重的容器,而equal_range()
函数则是multiset
的一个非常常用的成员函数。它用于查找某个值在multiset
中出现的范围,返回一个由两个迭代器组成的pair
容器对象。
函数原型
对于一个multiset<T>
对象ms
,equal_range()
函数原型如下:
std::pair<std::multiset<T>::const_iterator, std::multiset<T>::const_iterator> equal_range(const T& val) const;
其中,val
是要查找的值,pair
容器中包含的两个迭代器指向的就是最后一个小于等于val
的元素和第一个大于val
的元素,即查找范围为:
[第一个迭代器, 第二个迭代器)
如果没有找到对应值,则返回的两个迭代器都指向ms.end()
。
使用示例
在这里,我们通过一个简单的示例演示如何使用multiset
和equal_range()
函数。假设我们需要统计某个班的学生考试成绩,并且对于每个分数值,我们要分别计算出其中的最高分和最低分。
为了实现这个功能,我们可以使用一个multiset<int>
对象来存储所有的成绩,然后使用equal_range()
函数查找每个不同的成绩值在multiset
中的范围,然后从该范围内获取最高分和最低分即可。
以下是完整的代码实现:
#include <iostream>
#include <set>
int main()
{
std::multiset<int> scores = { 89, 78, 92, 76, 89, 82, 91, 76, 92 };
for (int score = 60; score <= 100; ++score)
{
auto range = scores.equal_range(score);
if (range.first != scores.end() && range.second != scores.end())
{
std::cout << "Score " << score << ": min = " << *range.first << ", max = " << *(std::prev(range.second)) << '\n';
}
}
return 0;
}
在这个例子中,我们首先将每个学生的成绩存储在了一个multiset<int>
对象scores
中。然后,我们使用一个循环来遍历60到100之间所有可能的成绩值,并使用equal_range()
函数查找它们在scores
中的范围。如果找到了范围,则输出范围内的最低分和最高分。
注意,std::prev()
函数用于获取迭代器的前一个元素。由于std::multiset
内部自动排序,因此迭代器之间的关系就对应着元素之间的大小关系。因此,使用std::prev()
函数可以很容易地获得某个迭代器的前一个元素。
结论
multiset
中的equal_range()
函数是一个非常常用的成员函数,用于查找某个值在multiset
中的范围。它的使用非常简单,并且实现起来也很容易。通过这个函数,我们可以方便地获取某个值在multiset
中的出现次数,或者查找某个值的相邻元素。