代码之家  ›  专栏  ›  技术社区  ›  DuckQueen

如何检查映射::lower\u bound failure?

  •  1
  • DuckQueen  · 技术社区  · 8 年前

    我想从映射a中获得一个密钥值对,该密钥小于或等于给定的K。 我想得到这样的结束(或rend或任何错误指示) simple code nearly same :

    #include <iostream>
    #include <map>
    using namespace std;
    
    int main() {
        map<int, int> m;
        m[56]= 666;
        auto it = m.lower_bound(1);
        if(it != m.end()) {
            cout << it->first;
        } else {
            cout << "this was expected!=(";
        }
        return 0;
    }
    

    对于下限和上限,我得到了相同的坏结果。我做错了什么?

    2 回复  |  直到 8 年前
        1
  •  2
  •   Nasser Al-Shawwa    8 年前

    根据cppreference。通用域名格式:

    1. lower_bound 返回指向第一个元素的迭代器 不少于 than键
    2. upper_bound 返回指向第一个元素的迭代器 更大的 than键

    因此,在这两种情况下,您应该 666 对于 it->second ,因为您插入的一个元素(键=56)满足这些条件。

    下面是我如何编写条件:

    int main() {
        map<int, int> m;
        m[56] = 666;
        int myKey = 1;
        auto it = m.upper_bound(myKey);
    
        if (it == m.begin()) {
            cout << "Key less than or equal to " << myKey << " doesn't exist\n"; 
        } else {
            --it; // <- This is the key you are looking for
        }
    
        return 0;
    }
    

    在本例中,我们检查是否有大于键的元素。如果它是地图中的最低点,那么你要找的东西就不存在了。否则,我们只需将前一个元素与 上限\u .

        2
  •  0
  •   miradham    8 年前

    根据 this explanation

    返回一个迭代器,该迭代器指向容器中的第一个元素 键不被认为在k之前 (即,要么是等价的,要么是后续的)。

    因此,在您的示例中得到56是意料之中的,因为它确实 在1之前进行。

    要实现目标,请使用 upper_bound 它返回 放心 高于给定“k”的键,如果找到,则减少迭代器:

    auto it = m.upper_bound(key);
    if (it == m.begin()) {
        // First and all other values are higher than key
        it == m.end();
    }
    else {
        // Found higher value, one previous is equal or less than key
        it--;
    }