问题发生场景
本来项目中选型选择的是QMap来存储相应的键值对,根据Map中的键的顺序取出对应的值。但是在使用的过程中,发现会有相同的键存入到map中,故而之前这个键对应的值会被覆盖,导致最终少一组数据。
解决办法
针对于上述问题,我这里不想改动太多的代码,故而进行最优的解决方案筛选。
方案一
使用QSet。虽解决了相同的键都可以存入的问题,但是也引入一个新的问题,那就是QSet虽然是键值对,但是日常使用中,都只存储了值,像这样QSet< double>,无法直接达到QMap<double,QWidget*>这样的效果。
方案二
使用QMultiMap。将存储数据的类型从QMap直接变为QMultiMap看着需要修改的代码很少,似乎原有的代码,只需变更QMap为QMultiMap。但是我变更至QMultiMap之后,发现编译时QMultiMap类型的变量使用[]时会报错。说是无法访问私用成员变量[]。故而我也没有采用这个方案。
方案三(重点)
使用原有的变量选型QMap,但是在向QMap中存储键值对前先判断是否QMap中已经有相同键的值被存储了。
若是QMap中已经存有这个键,使用函数inertMulti()。这个函数可以将相同的键在QMap中进行保存。
针对方案三的示例
下面是一个简单的小示例。
QMap<double, QWidget *> m_lesionMap;
void ClassWgt::saveLessionWidgetKeyIndex(const double &dKeyIndex,
QWidget *pWidget)
{
bool ret = mapIsAlreadyHasSameKeyLession(dKeyIndex);
if (ret)
{
m_lesionMap.insertMulti(dKeyIndex, pWidget);
}
else
{
m_lesionMap[dKeyIndex] = pWidget;
}
}
bool ClassWgt::mapIsAlreadyHasSameKeyLession(const double &dKeyIndex)
{
auto it = m_lesionMap.find(dKeyIndex);
while (it != m_lesionMap.end())
{
return true;
}
return false;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)