C++中std::set::lower_bound和std::lower_bound的区别

C++中std::set::lower_bound和std::lower_bound的区别

C++中,有时候我们需要在一组数据中查找某个值或者查找符合特定条件的第一个元素。为了方便开发者,C++提供了一系列STL算法,其中的两个函数:std::set::lower_boundstd::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_boundC++ 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_boundstd::lower_bound都能查找第一个大于等于某个值的元素,但是它们之间还是有一些区别的。对于使用了std::set的开发者来说,std::set::lower_bound更加方便,而对于普通的迭代器容器,则可以选择使用std::lower_bound

需要注意的是,使用std::set::lower_bound时不需要担心数据是否有序,并且返回的是set容器中的迭代器,可以直接对元素进行操作;而std::lower_bound需要先确保数据有序,返回的是普通迭代器,需要根据实际情况进行操作。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程