我正在使用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;功能目的。 我怎样才能摆脱这种断言失败?
答案 0 :(得分:2)
lower_bound
将返回等于地图的end()
的迭代器,并且它是&#39}插入点将位于地图的末尾。由于end()
是过去地图的结尾,因此它不会指向地图的有效元素。试图取消引用它是一个错误。很幸运,你在调试模式下使用已检查的迭代器运行它,否则你只是得到了未定义的行为,而不是一个很好的错误消息。
当您在没有greater
的情况下订购地图时,它更改的原因是它会更改地图的顺序; lower_bound
现在返回begin()
而不是end()
,其中 是有效元素。
要查看是否在地图中找到了该元素,您应该使用equal_range
而不是lower_bound
,并检查两个迭代器是否不相等。这两个中的第一个与lower_bound
返回的内容相同。