📌  相关文章
📜  C++中的Pairs Map上的lower_bound()和upper_bound()的实现(1)

📅  最后修改于: 2023-12-03 14:59:50.546000             🧑  作者: Mango

C++中的Pairs Map上的lower_bound()和upper_bound()的实现

在C++的STL中,pairs map是一种关联式容器,其中存储的是键值对,可以通过键快速查找其对应的值。pairs map中的lower_bound()和upper_bound()函数则是实现快速查找的重要手段。

lower_bound()函数

pairs map中的lower_bound()函数是用于在指定键值的范围内查找第一个大于等于给定键值的元素的迭代器。lower_bound()函数的实现如下:

template<class Key, class T, class Compare = std::less<Key>,
         class Allocator = std::allocator<std::pair<const Key, T>>>
class map {
public:
    iterator lower_bound(const key_type& x) {
        iterator i = begin(), j = end();
        while (i != j) {
            iterator m = i + (j - i) / 2;
            if (comp(m->first, x)) {
                i = m + 1;
            } else {
                j = m;
            }
        }
        return i;
    }
};

lower_bound()函数使用二分查找的方式在map中查找指定元素。首先,将i指向map的起始位置,将j指向map的末尾位置。然后,计算m等于i和j中间位置的迭代器,并比较m指向的元素和给定键值x大小关系。如果m指向的元素小于等于x,则说明要查找的元素在m的右边,将i移动到m的右边;如果m指向的元素大于x,则说明要查找的元素在m的左边,将j移动到m的左边。最终,返回i。

upper_bound()函数

pairs map中的upper_bound()函数是用于在指定键值的范围内查找第一个大于给定键值的元素的迭代器。upper_bound()函数的实现如下:

template<class Key, class T, class Compare = std::less<Key>,
         class Allocator = std::allocator<std::pair<const Key, T>>>
class map {
public:
    iterator upper_bound(const key_type& x) {
        iterator i = begin(), j = end();
        while (i != j) {
            iterator m = i + (j - i) / 2;
            if (comp(x, m->first)) {
                j = m;
            } else {
                i = m + 1;
            }
        }
        return i;
    }
};

upper_bound()函数也使用二分查找的方式在map中查找指定元素。与lower_bound()函数类似,首先将i指向map的起始位置,将j指向map的末尾位置。然后,计算m等于i和j中间位置的迭代器,并比较m指向的元素和给定键值x大小关系。如果m指向的元素小于x,则说明要查找的元素在m的右边,将i移动到m的右边;如果m指向的元素大于等于x,则说明要查找的元素在m的左边,将j移动到m的左边。最终,返回i。

总结

在C++的STL中,pairs map中的lower_bound()和upper_bound()函数是实现快速查找的重要手段。lower_bound()函数用于查找第一个大于等于给定键值的元素,upper_bound()函数用于查找第一个大于给定键值的元素。它们的实现都是通过二分查找的方式在map中查找指定元素,并返回对应的迭代器。