1

我想从 map a 中获取一个 key-val 对,其中 key 小于或等于给定的 K。我想得到 end (或 rend 或任何错误指示)如此简单的代码并且几乎相同

#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,我得到了同样糟糕的结果。我做错了什么?

4

2 回答 2

2

根据 cppreference.com:

  1. lower_bound返回指向第一个不小于key的元素的迭代器
  2. upper_bound返回指向第一个大于key的元素的迭代器

因此,在这两种情况下,您都应该得到666for 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

于 2017-12-14T11:03:27.503 回答
0

按照这个解释

返回一个迭代器,该迭代器指向容器中的第一个元素,其键不被认为在 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--;
}
于 2017-12-14T10:48:33.247 回答