我有qmap
<int , Myclass*>
密钥的范围为1
到n_max
。
当我插入地图时,我需要知道最低的未使用密钥。
例如,如果地图包含
&lt; 1,obj1&gt;
&lt; 3,obj3&gt;
当我在地图中插入下一个项目时,我希望将密钥分配为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是返回值。