C ++ map lower_bound导致调试断言失败

时间:2014-05-09 04:05:59

标签: visual-c++ map stl

我正在使用Visual Studio 2012。

我为这样的地图做了一个课:

classA
{
private:
    string a;
    string b;
    uint32_t start;
    uint32_t end;
};

我定义了一个地图和这样的函数:

typedef std::map<uint32_t, classA, std::greater<uint32_t> > ClassAMap;
typedef ClassAMap::iterator ClassAMapIterator;

ClassAMap classAMap;
void lowerBoundTest(ClassAMap &classAMap)
{
    uint32_t test = 0;
    ClassAMapIterator it;

    cin >> hex >> test;
    it = classAMap.lower_bound(test);
    cout << "lower_bound of " << test << ": "
         << it->first << endl;
}

然后在解除引用地图的迭代器时出现此错误。

Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: C:\program files (x86)\microsoft visual studio 11.0\vc\include\xtree
Line: 137
Expression: map/set iterator not dereferencable
For information on how your program can cause an assertion failure, 
see the Visual C++ documentation on asserts.
(Press Retry to debug the application)

当我定义这样的地图时,我没有收到任何错误消息:

typedef std::map<uint32_t, classA> ClassAMap;
typedef ClassAMap::iterator ClassAMapIterator;

但我需要放一个更大的&lt;&gt;功能目的。 我怎样才能摆脱这种断言失败?

1 个答案:

答案 0 :(得分:2)

当您在地图中搜索的项目不在地图中时,

lower_bound将返回等于地图的end()的迭代器,并且它是&#39}插入点将位于地图的末尾。由于end()过去地图的结尾,因此它不会指向地图的有效元素。试图取消引用它是一个错误。很幸运,你在调试模式下使用已检查的迭代器运行它,否则你只是得到了未定义的行为,而不是一个很好的错误消息。

当您在没有greater的情况下订购地图时,它更改的原因是它会更改地图的顺序; lower_bound现在返回begin()而不是end(),其中 是有效元素。

要查看是否在地图中找到了该元素,您应该使用equal_range而不是lower_bound,并检查两个迭代器是否不相等。这两个中的第一个与lower_bound返回的内容相同。