【问题标题】:C++ map lower_bound causes debug assertion failedC++ map lower_bound 导致调试断言失败
【发布时间】:2014-05-09 04:05:59
【问题描述】:

我正在使用 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;

但我需要设置一个更大的函数。 我怎样才能摆脱这种断言失败?

【问题讨论】:

  • lower_bound 可以返回end() 的结果,你检查了吗?
  • @MarkRansom 你应该回答这个问题。
  • 其实我一开始加了 if (it != classAMap.begin() || it != classAMap.end()) ,然后修改 ||到 && 然后它工作正常。谢谢。
  • @RSahu 我很惊讶没有人提出这个观察结果。我已将其扩展为我认为非常完整的答案。

标签: visual-c++ map stl


【解决方案1】:

lower_bound 将返回等于地图的 end() 的迭代器,当您要搜索的项目不在地图中时,它的插入点将位于地图的末尾。由于end() 是地图末尾的一个过去,它不指向地图的有效元素。试图取消引用它是一个错误。幸运的是,您在调试模式下使用检查过的迭代器运行此程序,否则您只会得到未定义的行为,而不是很好的错误消息。

在没有greater的情况下订购地图时它发生变化的原因是它改变了地图的顺序; lower_bound 现在返回begin() 而不是end(),这一个有效的元素。

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

【讨论】:

    猜你喜欢
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2021-01-27
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多