在QMap中查找缺少的键

时间:2012-03-09 10:30:54

标签: qt qmap

我有qmap <int , Myclass*>

密钥的范围为1n_max

当我插入地图时,我需要知道最低的未使用密钥。

例如,如果地图包含

  

&lt; 1,obj1&gt;

     

&lt; 3,obj3&gt;

当我在地图中插入下一个项目时,我希望将密钥分配为2

最有效的方法是什么

此致

2 个答案:

答案 0 :(得分:1)

您可能想要做一些事情来优化搜索。

首先,检查count()与map.end()之前的记录(即 - )之类的内容。如果它们是相同的,你知道它已经满了,可以在最后添加。

如果它们不是(结束迭代器值大于count()),那么你知道你需要搜索一个洞。搜索整体时,您可能希望拉出所有uniqueKeys(),然后在其中间开始搜索以查看中间密钥是否与之前的count()/2匹配。如果没有,请继续向下移动count()/4,否则按count()/4向上移动。重复,直到找到你要找的东西。

但实际上,我不确定地图是否是正确的容器。听起来你需要一个数组或链表或......这取决于你的数据。但如果您需要使用地图进行上述操作,我建议您可能需要找到合适的容器。

答案 1 :(得分:0)

由于QMap保持按键排序的项目,您可以使用c ++标准库中的adjacent_find算法:

#include <QMap>
#include <algorithm>

bool missing (int i, int j) {
  return (i+1 < j);
}

int next_key(const QMap<int,int>& map) {
  if (!map.size()) 
    return 1; // or 0, if an acceptable key value

  QList<int>::iterator i = std::adjacent_find(map.keys().begin(), map.keys().end(), missing);

  if (i==map.keys().end()) // no missing values found
    --i; 

  return *i + 1;
}

复杂度恰好是(结果 - 第一个)+ 1和(最后 - 第一个)中较小的一个 - 谓词的一个应用程序(&#34;缺少&#34;函数),其中result是返回值。