我正在尝试在QMap
中找到最接近的RGB值(我知道它可能应该是HSV,但这不是问题)。这是我到目前为止所得到的:
it = images_map.find(current_rgb);
if(it != images_map.begin()){
mi = images_map.lowerBound(current_rgb).value();
}
else{
mi = images_map.upperBound(current_rgb).value();
}
我的地图看起来像是有索引:
images_map[ 4283914078 ]
images_map[ 4284046165 ]
images_map[ 4284902241 ]
images_map[ 4289239953 ]
images_map[ 4282200377 ]
images_map[ 4289440688 ]
当我的current_rgb
例如4285046165
时,没关系,但如果某个值大于最大索引,则程序崩溃。我做错了什么?
答案 0 :(得分:3)
可能是因为.value()
试图取消引用不存在的项目?
这看起来像您自己的自定义地图实现(或包装器),但您的逻辑似乎不正确
lowerBound
- 除非您要查找的项目是地图中的第一项逻辑应该是这样的:
lowerBound
答案 1 :(得分:1)
致电
images_map.upperBound(current_rgb)
可以返回
images_map.end()
在这种情况下,您不应该致电value()
。
答案 2 :(得分:0)
您可以通过添加标记值0x000000
和0xFFFFFF
(一次)来解决迭代器超出范围的问题。这样,您总是有一个有效的低位和高位。当然,这可能会影响算法的结果。例如。如果你的“最小”真实颜色是纯蓝色(0x0000FF
),那么深蓝色(0x00007F
)现在会发现黑色,而不是纯蓝色。当然,这可以通过两次比较轻松解决。
随着哨兵到位,请致电QMap::lower_bound
。您需要检查是否确实找到了精确匹配:如果*lower_bound
是您想要的值,请将其返回。否则,lower_bound
指向比输入更大的第一个元素。因此,--lowerbound
指向小于输入的最后一个元素。检查两者中哪一个更接近。
请注意,lower_bound
指向begin
的唯一方式是您的输入正好是0x000000
(哨兵),在这种情况下您将无法访问--lower_bound
}。那里没有范围错误。按照相同的逻辑,结束标记0xFFFFFF
意味着您总能找到lower_bound
。