如何检查map::lower_bound失败?

How to check map::lower_bound failure?

我想从映射 a 中获取一个键值对,该键值小于或等于给定的 K。 我想结束(或撕裂或任何错误指示)So simple code and 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;
}

我对 lower_bound 和 upper_bound 得到了同样糟糕的结果。我做错了什么?

根据this explanation

Returns an iterator pointing to the first element in the container whose key is not considered to go before k (i.e., either it is equivalent or goes after).

所以在你的例子中得到 56 是意料之中的,因为它 而不是 在 1 之前。

要实现您的目标,请使用 upper_bound returns 保证 比给定 '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--;
}

根据cppreference.com:

  1. lower_bound returns 指向第一个元素的迭代器不少于 比 key
  2. upper_bound returns 指向第一个比键
  3. 的元素的迭代器

因此,在这两种情况下,您应该为 it->second 获得 666,因为您插入的一个元素(键 = 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;
}

在这种情况下,我们会检查是否有元素大于您的键。如果它是地图中最低的键,那么您要找的东西不在那里。否则,我们只是将前一个元素获取到 upper_bound.

找到的元素