Al usar QMap para guardar datos, si aparece la misma tecla, puede usar la función insertMulti para resolverlo sin cambiar la selección original de almacenamiento de variables.

escena del problema

Originalmente, se seleccionó QMap en la selección de proyectos para almacenar los pares clave-valor correspondientes, y los valores correspondientes se recuperaron de acuerdo con el orden de las claves en el Mapa. Pero en el proceso de uso, se encuentra que la misma clave se almacenará en el mapa, por lo que se sobrescribirá el valor anterior correspondiente a esta clave, lo que resultará en una falta final de un conjunto de datos.

Solución

Para los problemas anteriores, no quiero cambiar demasiado el código aquí, así que evaluaré la solución óptima.

opcion uno

Utilice QSet. Si bien soluciona el problema de que se puede almacenar la misma clave, también introduce un nuevo problema, es decir, aunque QSet es un par clave-valor, pero en el uso diario solo se almacena el valor, así QSet<doble>, no puede ser directamente Lograr el efecto de QMap<doble, QWidget*>.

Opción II

Utilice QMultiMap. Cambiar el tipo de datos almacenados de QMap directamente a QMultiMap parece que hay muy pocos códigos que necesitan ser modificados Parece que el código original solo necesita cambiar QMap a QMultiMap. Pero después de cambiar a QMultiMap, descubrí que al compilar una variable de tipo QMultiMap usando [], se informará un error. Se dice que no se puede acceder a la variable miembro privada []. Por lo tanto, no adopté este plan.

Opción tres (puntos clave)

Utilice el QMap de selección de variables original, pero antes de almacenar el par clave-valor en el QMap, primero determine si el valor de la misma clave ya está almacenado en el QMap.
Si la clave ya existe en QMap, utilice la función inertMulti(). Esta función puede guardar la misma clave en QMap.

Ejemplo para el Escenario Tres

A continuación se muestra un pequeño ejemplo simple.

// 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;
}

Supongo que te gusta

Origin blog.csdn.net/blqzj214817/article/details/130013433
Recomendado
Clasificación