使用QMap保存数据时,若出现相同的键,可以在不改变原有的变量存储选型基础上,使用insertMulti函数来解决

问题发生场景

本来项目中选型选择的是QMap来存储相应的键值对,根据Map中的键的顺序取出对应的值。但是在使用的过程中,发现会有相同的键存入到map中,故而之前这个键对应的值会被覆盖,导致最终少一组数据。

解决办法

针对于上述问题,我这里不想改动太多的代码,故而进行最优的解决方案筛选。

方案一

使用QSet。虽解决了相同的键都可以存入的问题,但是也引入一个新的问题,那就是QSet虽然是键值对,但是日常使用中,都只存储了值,像这样QSet< double>,无法直接达到QMap<double,QWidget*>这样的效果。

方案二

使用QMultiMap。将存储数据的类型从QMap直接变为QMultiMap看着需要修改的代码很少,似乎原有的代码,只需变更QMap为QMultiMap。但是我变更至QMultiMap之后,发现编译时QMultiMap类型的变量使用[]时会报错。说是无法访问私用成员变量[]。故而我也没有采用这个方案。

方案三(重点)

使用原有的变量选型QMap,但是在向QMap中存储键值对前先判断是否QMap中已经有相同键的值被存储了。
若是QMap中已经存有这个键,使用函数inertMulti()。这个函数可以将相同的键在QMap中进行保存。

针对方案三的示例

下面是一个简单的小示例。

// QMap型变量的声明如下
QMap<double, QWidget *> m_lesionMap;

void ClassWgt::saveLessionWidgetKeyIndex(const double &dKeyIndex,
                                           QWidget *pWidget)
{
    
    
    bool ret = mapIsAlreadyHasSameKeyLession(dKeyIndex);
    if (ret) //相同的键采用insertMulti函数来保存到QMap中
    {
    
    
        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;
}

猜你喜欢

转载自blog.csdn.net/blqzj214817/article/details/130013433