gpt4 book ai didi

c++ - unordered_map 不起作用

转载 作者:行者123 更新时间:2023-11-28 02:36:23 27 4
gpt4 key购买 nike

<分区>

我在 Visual C++ 16.0(Visual Studio 2010 附带的那个)中尝试了各种实现,但我遇到了 std::unordered_map 的各种错误。

例如

CKey key = pszName;
auto it = m_Records.find(key);
if (it != m_Records.end())
{
// we replace existing item (so delete old)
delete it->second;
it->second = pRecord;
}
else
{
const size_t sz = m_Records.size();
m_Records.insert(std::make_pair(key, pRecord));
const size_t sz2 = m_Records.size();
assert((sz + 1) == sz2); // this assertion fails! wtf!
}

m_Records是一个 std::unordered_map 实例。所以我切换到boost::unordered_map 1.48.现在这确实有效,但我在其他地方遇到了另一个问题。虽然上面的代码相同,但相同的 key 不断被插入两次或更多次。为什么我的 map 无法管理最简单的事情并且每个键只保留一个条目?

我已经三次检查哈希函数和比较函数。我不认为他们应该为此负责。

我做错了什么?

m_Records 的类型是 boost::unordered_map<CKey, CRecord*>std::unordered_map<CKey, CRecord*> .

CKey定义如下:

struct CKey
{
const wchar_t* m_Str;
int m_Len;

CKey(const wchar_t* s)
: m_Str(s)
, m_Len(s ? (int)wcslen(s) : 0)
{
}

size_t hash() const
{
if (this->m_Len > 0)
{
char temp[16];
memset(temp, 0, sizeof(temp));
MurmurHash3_x64_128(this->m_Str, (int)sizeof(wchar_t) * this->m_Len, 0, temp);
size_t hash = *(size_t*)temp;
return hash;
}
return 0;
}

bool operator==(const CKey& other) const
{
if ((this->m_Len > 0) & (this->m_Len == other.m_Len))
{
return (wcscmp(this->m_Str, other.m_Str) == 0);
}
// otherwise, they are only equal if they are both empty
return (this->m_Len == 0) & (other.m_Len == 0);
}
};

namespace boost
{
template <>
struct hash<CKey>
{
size_t operator()(const CKey& k) const
{
return k.hash();
}
};
}

namespace std
{
template <>
struct equal_to<CKey>
{
bool operator()(const CKey& x, const CKey& y) const
{
return (x == y);
}
};
}

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com