永发信息网

c++ iterator not derefencable

答案:2  悬赏:30  手机版
解决时间 2021-04-05 07:35
  • 提问者网友:最爱你的唇
  • 2021-04-04 22:27
c++ iterator not derefencable
最佳答案
  • 五星知识达人网友:刀戟声无边
  • 2021-04-04 23:22
在模版类中的自定义push函数
if(m_data.empty() ||valuem_min.push(value);
else
m_min.push(m_min.top());
出错了,应检测的是m_min.empty();
另外程序会终止,因为stack是空的,m_min.top()属于未定义行为,所以在执行时有可能会被编译器忽略掉,所以在进行赋值m_min.push(m_min.top());时就会出错使程序强行中止掉

调用空stack的top()是未定义行为。
----------------------------------------------------------------------------------------
stack的内部容器是deque,对iStack调用top()相当于调用内部deque容器的back()。
C++标准(§ 23.2.3, Table 100)规定,对于顺序容器a,函数a.back()的实现如下:

{
auto tmp = a.end();
--tmp;
return *tmp;
}

在一个空的stack中,内部deque的begin() == end()。而且标准§ 24.2.6又规定,对一个双向/随机访问迭代器 r 执行前置operator--操作的前提条件是存在另一个迭代器 s 可以满足r == ++s。由于空stack的top()对内部deque容器的begin()执行了--操作,所以在没有任何优化的情况下,调用top()会导致编译无法通过。
全部回答
  • 1楼网友:轻熟杀无赦
  • 2021-04-05 00:51
实测编译通过
请发一下编译的完整错误信息
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯