如何检查map :: lower_bound失败?

时间:2017-12-14 10:27:16

标签: c++ dictionary stl lower-bound upperbound

我想从映射中得到一个键值对,哪个键小于或等于给定的K. 我希望得到结束(或撕裂或任何错误指示)所以simple codenearly 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得到了相同的错误结果。我做错了什么?

2 个答案:

答案 0 :(得分:1)

根据this explanation

  

返回一个指向容器中第一个元素的迭代器,其中键不被视为在k 之前(即,它是等效的或者之后)。

所以预计你的例子中会得到56,因为在1之前。

要实现您的目标,请使用upper_bound返回保证更高的密钥,而不是给定的&#39; k&#39;如果找到则减少迭代器:

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--;
}

答案 1 :(得分:1)

根据cppreference.com:

  1. lower_bound返回Iterator,指向不小于的第一个元素
  2. upper_bound返回Iterator,指向第一个更大而不是键
  3. 的元素

    因此,在这两种情况下,您应该为666获取it->second,因为您插入的一个元素(key = 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找到的元素。