【发布时间】:2016-02-12 07:24:07
【问题描述】:
我在使用 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
}
函数update 在我的代码中被多次调用(使用不同的 itemInfo 对象)。现在当我开始调试它时,我看到第一次调用update 时,第一个和第二个 if 循环都进入了。到现在为止还挺好。但是第二次调用update 我确实看到调用了第一个 if 循环,但第二个被跳过了!我在这里错过了什么?
【问题讨论】:
-
显示你的 QVariant 的
operator==,你也可以稍微编辑一下来制作一个 MCVE [stackoverflow.com/help/mcve]。 -
if(m_testMap.find(itemInfo) == m_testMap.end())的成功/失败取决于QVariant::operator<的行为。如果没有看到Minimal, Complete, and Verifiable example,就很难说出哪里出了问题。 -
所以它依赖于 operator
-
@Frank 默认情况下,
std::map考虑两个元素a和b,当且仅当!(a < b)和!(b < a)相等。如果您的QVariants 无法比较,那么它们在std::map眼中可能是相等的,您需要std::unordered_map或QHash或自定义比较器。