C++ std-map-find总是正确的
我在使用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) {
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不使用=运算符比较键,默认情况下使用运算符
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相等当且仅当!a
struct QVariantLessCompare {
bool operator()(const QVariant& v1,const QVariant& v2) const
{
return v1.toInt() < v2.toInt();
}
};