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

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

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

在C++中,std::map是一种关联式容器,其底层使用红黑树实现。红黑树是一种自平衡的二叉查找树,由于其平衡性能,导致在map的查找中效率非常高。

对于一个map对象,lower_bound()和upper_bound()是两种非常实用的成员函数。这两个函数都需要一个查找参数key,lower_bound()返回第一个大于或等于key的元素的迭代器,upper_bound()返回第一个大于key的元素的迭代器。

接下来我们将简要介绍C++中Pairs Map上的lower_bound()和upper_bound()的实现。

实现思路

C++中的map对象是基于Red-Black树实现的。因此,在实现lower_bound()和upper_bound()之前,我们需要了解Red-Black树的一些基本知识。

具体实现步骤如下:

  1. 定义一个指向根节点的指针root。
  2. 从根节点开始,沿着树向下遍历,直到找到第一个大于或等于key的节点,记录此节点为curNode。
  3. 如果curNode的值等于key,则直接返回curNode。
  4. 如果curNode的值小于key,则遍历curNode的右子树,寻找满足条件的节点。
  5. 如果curNode的值大于key,则遍历curNode的左子树,寻找满足条件的节点。
  6. 如果遍历到了叶子节点,返回null。

实现lower_bound()和upper_bound()的过程十分相似,唯一不同的是当curNode的值小于key时,需要递归遍历右子树找到upper_bound(),而不是递归遍历左子树。

代码实现
#include<map>
#include<iostream>

int main(){
    std::map<int, std::string>mp;
    mp[1] = "one";
    mp.insert(std::make_pair(2, "two"));
    mp[3] = "three";
    mp[4] = "four";
    mp[5] = "five";

    //lower_bound()实现
    std::map<int, std::string>::iterator it1;
    it1 = mp.lower_bound(3);
    if (it1 != mp.end()) {
        std::cout << "key: " << it1->first << " value: " << it1->second << std::endl;
    }
    else {
        std::cout << "not found" << std::endl;
    }

    //upper_bound()实现
    std::map<int, std::string>::iterator it2;
    it2 = mp.upper_bound(3);
    if (it2 != mp.end()) {
        std::cout << "key: " << it2->first << " value: " << it2->second << std::endl;
    }
    else {
        std::cout << "not found" << std::endl;
    }

    return 0;
}

上述代码中,我们首先定义了一个map对象mp,并向其中添加了一些元素。然后,我们使用lower_bound()函数在mp中查找键为3的元素。如果找到,则输出该元素的键和值,否则输出“not found”。同时,我们使用upper_bound()函数在mp中查找大于3的元素。同样,如果找到,则输出该元素的键和值,否则输出“not found”。

总结

本文简单介绍了C++中Pairs Map上的lower_bound()和upper_bound()的实现。通过了解Red-Black树的基本原理,我们可以实现这两个函数,并在实际开发中应用它们。