C++ std-map-find总是正确的

C++ std-map-find总是正确的,c++,qt,stl,find,stdmap,C++,Qt,Stl,Find,Stdmap,我在使用std::map时遇到问题,特别是在使用find时。 我有以下代码 class MyClass { update(const QVariant&); QVariant m_itemInfo; std::map<QVariant, int> m_testMap; } void update(const QVariant& itemInfo) { if(m_itemInfo != itemInfo) {

我在使用std::map时遇到问题,特别是在使用find时。 我有以下代码

class MyClass
{
    update(const QVariant&);
    QVariant m_itemInfo;
    std::map<QVariant, int> m_testMap;
}

void update(const QVariant& itemInfo)
{
    if(m_itemInfo != itemInfo)
    {
         // The items are not equal
         m_itemInfo = itemInfo;
    }
    if(m_testMap.find(itemInfo) == m_testMap.end())
    {
        // TestMap doesnt contain key itemInfo.
        m_testMap.insert(std::make_pair(itemInfo, 1));
    }

    // More code
}

在我的代码中,使用不同的itemInfo对象多次调用函数update。现在,当我开始调试它时,我看到第一次更新被调用,第一次和第二次if循环都被输入。到现在为止,一直都还不错。然而,第二次更新被调用,我确实看到第一个if循环被调用,但是第二个被跳过!我在这里遗漏了什么?

我想问题在于,传递给更新方法的第一个和第二个QVariant具有不同的类型,例如bool和uint。std::map::find不使用=运算符比较键,默认情况下使用运算符 如果容器的比较对象反射性地返回false(即,无论元素作为参数传递的顺序如何),则认为两个键是等效的

i、 e.std::map::find认为v1等于v2

    if(!(v1<v2) && !(v2>v1)) { //is TRUE !!!
    }
并以以下方式使用QVariantCompare:

    std::map<QVariant, int, QVariantLessCompare> m_testMap; 

更典型的解决方案是使用QMap,它正确地实现了大多数QVariant类型的比较。它不会做开箱即用的用户类型,但这可能仍然适合您的应用程序

一个更干净的版本的解决方案由СБааааАааааааСааа

struct QVariantLessCompare {
    bool operator()(const QVariant& v1,const QVariant& v2) const 
    {
        return v1.toInt() < v2.toInt();
    }
};

显示QVariant的运算符==,还可以编辑一点以生成MCVE[]。ifm_testMap.finditemInfo==m_testMap.end的成功/失败取决于QVariant::运算符的行为,也取决于operator@Frank默认情况下,std::map认为两个元素a和b相等当且仅当!astruct QVariantLessCompare { bool operator()(const QVariant& v1,const QVariant& v2) const { return v1.toInt() < v2.toInt(); } };