地图 - 找到最接近的值?

时间:2011-07-18 08:06:21

标签: c++ qt qmap

我正在尝试在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时,没关系,但如果某个值大于最大索引,则程序崩溃。我做错了什么?

3 个答案:

答案 0 :(得分:3)

可能是因为.value()试图取消引用不存在的项目?

这看起来像您自己的自定义地图实现(或包装器),但您的逻辑似乎不正确

  1. 您每次都会致电lowerBound - 除非您要查找的项目是地图中的第一项
  2. 如果它是地图中的第一个,则再次进行搜索???
  3. 如果不是你再次搜索(如果已经找到再次重复操作),否则如果找不到,则查找最近的(可以),但是你处理没有的情况(即在{{ 1}})?
  4. 逻辑应该是这样的:

    lowerBound

答案 1 :(得分:1)

致电

images_map.upperBound(current_rgb) 

可以返回

images_map.end()

在这种情况下,您不应该致电value()

答案 2 :(得分:0)

您可以通过添加标记值0x0000000xFFFFFF(一次)来解决迭代器超出范围的问题。这样,您总是有一个有效的低位和高位。当然,这可能会影响算法的结果。例如。如果你的“最小”真实颜色是纯蓝色(0x0000FF),那么深蓝色(0x00007F)现在会发现黑色,而不是纯蓝色。当然,这可以通过两次比较轻松解决。

随着哨兵到位,请致电QMap::lower_bound。您需要检查是否确实找到了精确匹配:如果*lower_bound是您想要的值,请将其返回。否则,lower_bound指向比输入更大的第一个元素。因此,--lowerbound指向小于输入的最后一个元素。检查两者中哪一个更接近。

请注意,lower_bound指向begin的唯一方式是您的输入正好是0x000000(哨兵),在这种情况下您将无法访问--lower_bound }。那里没有范围错误。按照相同的逻辑,结束标记0xFFFFFF意味着您总能找到lower_bound