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

时间:2009-04-21 16:38:30

标签: c++ iterator stdmap

我在传统的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 ++不是我最强的语言,因为这是一个遗留应用程序,我'我试图帮助支持,我真的很想学习和理解为什么这是做它正在做的事情以供将来参考。另外,由于逻辑在其他地方起作用,而不是在这里,或许存在一个实际需要解决的根本原因。

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

相关问题