gpt4 book ai didi

c++ - std::map 迭代 - 调试和发布版本之间的顺序差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:27 25 4
gpt4 key购买 nike

这是我必须使用的一个通用代码模式:

class foo {
public:
void InitMap();
void InvokeMethodsInMap();
static void abcMethod();
static void defMethod();
private:
typedef std::map<const char*, pMethod> TMyMap;
TMyMap m_MyMap;
}

void
foo::InitMap()
{
m_MyMap["abc"] = &foo::abcMethod;
m_MyMap["def"] = &foo::defMethod;
}

void
foo::InvokeMethodsInMap()
{
for (TMyMap::const_iterator it = m_MyMap.begin();
it != m_MyMap.end(); it++)
{
(*it->second)(it->first);
}
}

但是,我发现处理 map 的顺序(在 for 循环内)可能会根据构建配置是 Release 还是 Debug 而有所不同。似乎发布版本中发生的编译器优化会影响此顺序。

我认为通过在上面的循环中使用 begin() 并在每次方法调用后递增迭代器,它会按初始化顺序处理映射。但是,我还记得读过一个 map 是作为哈希表实现的,无法保证顺序。

这特别烦人,因为大多数单元测试都是在调试版本上运行的,并且通常直到外部 QA 团队开始测试(因为他们使用发布版本)才会发现奇怪的顺序依赖错误。

谁能解释这种奇怪的行为?

最佳答案

不要使用 const char*作为 map 的关键。这意味着映射是按字符串的地址而不是字符串的内容排序的。使用 std::string作为键类型,而不是。

std::map不是哈希表,它通常实现为红黑树,并且元素保证按某些标准排序(默认情况下,< 键之间的比较)。

关于c++ - std::map 迭代 - 调试和发布版本之间的顺序差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/137258/

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