C++中std::set::lower_bound和std::lower_bound的区别
在C++中,有时候我们需要在一组数据中查找某个值或者查找符合特定条件的第一个元素。为了方便开发者,C++提供了一系列STL算法,其中的两个函数:std::set::lower_bound
和std::lower_bound
都可以实现这个功能。那么两者之间有什么区别呢?本文将详细讲解这个问题。
std::set::lower_bound和std::lower_bound的定义
首先,让我们来看一下这两个函数的定义。
std::set::lower_bound
在C++ STL中,std::set
是一个基于RB-Tree的关联容器,用来存储一些有序的元素。std::set::lower_bound
是该容器中定义的一个成员函数,具有以下两个重载形式:
iterator lower_bound(const key_type& k);
const_iterator lower_bound(const key_type& k) const;
这两个函数都会返回一个迭代器,该迭代器指向第一个大于等于k的元素。
std::lower_bound
std::lower_bound
是C++ STL中一个位于
template <class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& value);
该函数会在[first, last)区间内查找第一个大于等于value的元素,并返回一个迭代器,该迭代器指向这个元素。
std::set::lower_bound和std::lower_bound的区别
通过上面的定义,我们可以看出在使用这两个函数时,有以下几个方面的区别。
数据结构
std::set::lower_bound
是针对std::set
这个关联容器而设计的,而std::lower_bound
则不依赖于任何容器,只要提供相关的迭代器即可。
通常情况下,我们在使用std::lower_bound
时,需要保证数据是有序的,并且可以使用迭代器进行访问。而std::set::lower_bound
则不需要关心数据是否有序,因为std::set
会在插入元素的过程中自动进行排序操作。
参数类型
std::set::lower_bound
的参数是一个key值,表示要查找的元素;而std::lower_bound
则需要一个区间范围和要查找的值作为参数。
这也是区别之一。在使用std::set
时,我们可以直接调用其成员函数,传递key值进行查找;而在使用std::lower_bound
时,需要先保证数据有序,并将数据的迭代器范围和要查找的值作为参数传入函数。
迭代器
std::set::lower_bound
的返回值是一个迭代器,指向第一个大于等于key值的元素;std::lower_bound
的返回值也是一个迭代器,指向第一个大于等于要查找值的元素。
在使用std::set::lower_bound
时,我们可以通过返回的迭代器,直接对set中的元素进行操作;而在使用std::lower_bound
时,我们需要根据返回的迭代器,来完善查找的操作。
示例代码
为了更好地理解上述的区别,我们来看一下下面的例子。
假设我们有一个vector,包含如下数据:
vector<int> vec = {1, 2, 4, 6, 7, 9, 11};
现在我们需要查找第一个大于等于5的元素,并输出其下标。我们可以这样使用std::lower_bound
:
auto it_lb = std::lower_bound(vec.begin(), vec.end(), 5);
if(it_lb !=vec.end()) {
std::cout << "The first element >= 5 is at index " << it_lb - vec.begin() << std::endl;
} else {
std::cout << "No element >= 5 found in the vector." << std::endl;
}
接下来,我们试试使用std::set::lower_bound
来完成同样的操作。
假设我们已经将上述数据插入到一个set中:
std::set<int> s{1, 2, 4, 6, 7, 9, 11};
然后我们可以这样调用std::set::lower_bound
:
auto it_s_lb = s.lower_bound(5);
if(it_s_lb != s.end()) {
std::cout << "The first element >= 5 is " << *it_s_lb << std::endl;
} else {
std::cout << "No element >= 5 found in the set." << std::endl;
}
需要注意的是,std::set::lower_bound
返回的是一个迭代器,我们需要通过解引用操作来获取具体的元素值。
总结
虽然std::set::lower_bound
和std::lower_bound
都能查找第一个大于等于某个值的元素,但是它们之间还是有一些区别的。对于使用了std::set
的开发者来说,std::set::lower_bound
更加方便,而对于普通的迭代器容器,则可以选择使用std::lower_bound
。
需要注意的是,使用std::set::lower_bound
时不需要担心数据是否有序,并且返回的是set
容器中的迭代器,可以直接对元素进行操作;而std::lower_bound
需要先确保数据有序,返回的是普通迭代器,需要根据实际情况进行操作。