我想从映射中得到一个键值对,哪个键小于或等于给定的K. 我希望得到结束(或撕裂或任何错误指示)所以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;
}
我为lower_bound和upper_bound得到了相同的错误结果。我做错了什么?
答案 0 :(得分:1)
返回一个指向容器中第一个元素的迭代器,其中键不被视为在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:
lower_bound
返回Iterator,指向不小于的第一个元素upper_bound
返回Iterator,指向第一个更大而不是键因此,在这两种情况下,您应该为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
找到的元素。