gpt4 book ai didi

c++ - std::map 迭代器不在 MFC 应用程序中迭代

转载 作者:行者123 更新时间:2023-11-28 01:13:23 25 4
gpt4 key购买 nike

我在遗留 MFC 应用程序中声明了一个 std::map:

typedef std::map<long, CNutrientInfo> NUTRIENT_INFO_MAP;
typedef NUTRIENT_INFO_MAP::const_iterator NUTRIENT_INFO_ITER;
typedef NUTRIENT_INFO_MAP::value_type NUTRIENT_INFO_PAIR;
static NUTRIENT_INFO_MAP m_NutrientInfoMap;

m_NutrientInfoMap 在应用程序加载时通过循环遍历表并创建 CNutrientInfo 实例然后将其插入到 std:map 中进行填充,如下所示:

m_NutrientMapInfo.insert(NUTRIENT_INFO_PAIR(nutrient.GetId(), nutrient));

std::map 现在包含已由数据库定义的营养素列表。在某个时候,用户可以向该列表添加新的营养素,它会检查用户添加的内容是否已存在于列表中。它会像这样检查:

NUTRIENT_INFO_ITER iter = m_NutrientInfoMap.begin();
while (iter != m_NutrientInfoMap.end())
{
m = (*iter).second;
if (_stricmp(m.GetFullName().c_str(), name.c_str()) == 0)
{
return m;
}
iter++;
}

或者至少应该如此。当函数实际被调用时,它永远不会超过 while 循环的初始行。在那里放置一个断点只是表明有问题的行被一遍又一遍地调用并且永远不会超出它,这会挂起应用程序。如果您进入实际比较,它会正确比较,然后返回到 while 循环行。再次进入循环体只是返回到 while 循环行。应用程序中的其他地方也使用了相同的逻辑,没有任何问题,所以我对这种情况下发生的事情感到困惑。我已经使用 for 循环重写了上面的逻辑,它工作得很好,所以我并不是不能解决它,但 C++ 不是我最擅长的语言,因为这是我的遗留应用程序我试图帮助支持,我真的很想学习和理解为什么这样做,以供将来引用。另外,由于逻辑在其他地方有效,而不是在这里,可能有一个根本原因才是真正需要解决的问题。

对此有任何建议或想法,我们将不胜感激。

提前致谢。

最佳答案

您的示例实际上是从源代码粘贴的吗?也许它看起来更像:

while (iter != m_NutrientInfoMap.end());   // <== note the semi-colon
{
m = (*iter).second;
if (_stricmp(m.GetFullName().c_str(), name.c_str()) == 0)
{
return m;
}
iter++;
}

关于c++ - std::map 迭代器不在 MFC 应用程序中迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773525/

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