一、简介
STL(标准模板库)是C++中的一个重要组件,它包括了众多预定义的数据结构和算法,用于常见的操作。equal_range算法是STL算法库中的一员,它用于在有序序列中查找相同元素的范围。equal_range算法的底层实现是二分查找,因此具有较高的效率。
二、基本用法
equal_range的基本语法如下:
pair<iterator, iterator> equal_range(iterator begin, iterator end, const T& value)
其中,begin、end是序列的起始和终止迭代器,value是需要查找的元素。如果序列中存在该元素,则equal_range返回一个pair对象,其中的两个迭代器标记了该元素第一次出现和最后一次出现的位置。 以下是一个简单的示例代码:
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<int> vec = {1, 2, 3, 4, 4, 5, 6};
auto range = equal_range(vec.begin(), vec.end(), 4);
cout << "范围为 [" << distance(vec.begin(), range.first) << ", " << distance(vec.begin(), range.second) << ")" << endl;
return 0;
}
在以上示例代码中,vector<int> vec
是一个有序的向量。equal_range(vec.begin(), vec.end(), 4)
返回了一个包含迭代器的pair对象,其中第一个迭代器表示元素4在vec中第一次出现的位置,第二个迭代器表示元素4在vec中最后一次出现的位置。cout
语句输出了这个范围。
三、自定义比较函数
equal_range可以接受一个额外的参数,用于指定如何进行元素的比较。如果不传递此参数,则默认使用"=="进行比较。在一些情况下,我们需要自定义比较函数。以下是一个示例代码,用于在一个有序的字符串向量中查找一个字符串,并返回其出现次数:
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
vector<string> vec = {"abc", "def", "ghi", "ghi", "jkl"};
int count = 0;
auto range = equal_range(vec.begin(), vec.end(), "ghi", [](const string& a, const string& b) {
return a.length() < b.length();
});
for (auto it = range.first; it != range.second; ++it)
{
if (*it == "ghi")
{
++count;
}
}
cout << "字符串 \"ghi\" 出现了 " << count << " 次" << endl;
return 0;
}
在以上示例代码中,vector<string> vec
是一个有序的字符串向量。equal_range
的第三个参数是需要查找的字符串"ghi"。比较函数是一个lambda表达式,用于按照字符串的长度进行比较。range
表示"ghi"出现的范围,for
循环用于计算"ghi"在vec中出现的次数。
四、注意事项
在使用equal_range时,需要注意以下几点:
- 序列必须是有序的。
- equal_range并不保证返回的范围是连续的,因此必须使用迭代器进行遍历。
五、总结
equal_range算法是STL算法库中的重要成员之一,它可以用于在有序序列中查找相同元素的范围。在使用equal_range时,必须保证序列是有序的,并且需要注意返回范围并不保证连续的问题。自定义比较函数可以扩展equal_range的功能。