【问题标题】:std::map iterator not iterating in MFC appstd::map 迭代器不在 MFC 应用程序中迭代
【发布时间】:2009-04-21 16:38:29
【问题描述】:

我在旧版 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++ 不是我最强大的语言,因为这是我的遗留应用程序我试图帮助支持,我真的很想学习和理解为什么这样做是为了将来参考。另外,由于逻辑在其他地方起作用,而不是在这里,也许有一个根本原因是真正需要解决的问题。

对此的任何建议或想法将不胜感激。

提前致谢。

【问题讨论】:

  • 你是在发布模式下调试吗?

标签: c++ iterator stdmap


【解决方案1】:

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

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++;
}

【讨论】:

  • 我认为你可能是对的。但是在再次检查@Scott 所说的内容时,他强行进入实际比较并返回循环。我只是想知道分号是否是问题所在。
  • @aJ - 如果在 while 控制表达式之后紧跟分号,那不是预期的(如果不希望的)行为吗?
  • @Scott - 如果 C/C++ 程序员说他从来没有遇到过这种情况,那么他要么编程时间不长,要么在撒谎。
  • 但是,这是一个例子,说明为什么复制-n-粘贴这些代码位是一个非常非常好的主意。
  • 非常真实的重新:复制/粘贴。当我重新输入该死的代码但仍然没有看到分号时,这让我更加惊讶。猜猜这就是作家有编辑的原因,校对自己的散文很容易出错。
【解决方案2】:

上面发布的代码中没有任何内容会导致该行为。您确定要在循环内增加其他迭代器,还是可能有两个具有相同名称的迭代器(一个在循环内)具有不同的范围,并且您正在增加错误的迭代器?如果不是这种情况,那么我能看到的唯一其他选择是记下 m_NutrientInfoMap.end() 的值并检查为什么 ++iter 没有评估该值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-27
    • 2012-09-30
    • 2021-05-08
    • 2012-08-28
    • 1970-01-01
    • 2020-03-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多