STL中的迭代器总是出现各种问题,这个是我在打表达式求值时碰到的...

综合网上的答案,一般来说有两种情况:

第一:访问了非法位置。

一般来说可能在queue为空时取front(),rear(),或者用list时误访最后一个结点,再或是在stack为空时进行了top(),pop()操作等。

一般来说用一下方法解决即可:

(1)在访问链表元素时判断当前迭代器是否指向链表尾

 list<Boom*>::iterator  ite=m_listBoom.begin();
while(ite!=m_listBoom.end())
{
(*ite)->BoomShow(hdc);
if(ite==m_listBoom.end())
6 {
7 return ;
8 }
ite++;
}

这是一段想对图片进行展示的代码,正常情况下红字部分我们是没有必要加的,但当你多次运行该程序时很可能会报错,错误为:list iterator not dereferencable

原因就是误访了尾节点。

(2)栈:

以下是表达式求值的部分代码(把中缀转后缀部分)

我在注释出刚开始是把!s1.empty()的判断放在后面的,于是就不停的报错...是不是很熟悉?

原因其实很简单,我们都知道在top(),pop()操作之前都要先判断栈是否为空

而又因为&&的短路原则,如果栈为空,则&&前面的表达式值为0,不会走后面对top()进行操作的代码,避免了错误

 #include<iostream>
#include<string.h>
#include<stack>
using namespace std;
stack<char>s1;
stack<int>s2;
char str[];
int num[];
int prior(char c)
{
if(c==')'||c=='(') return ;
else if(c=='+'||c=='-') return ;
else if(c=='*'||c=='/') return ;
}
void getLast(int n)
{
int i=;
char tmp;
for(i=;i<n;i++)
{
if(str[i]>=''&&str[i]<='')
{
s2.push(str[i]);
if(str[i+]>=''&&str[i+]<='')
{ }
else
{
s2.push('#');
}
}
else
{
if(s1.empty()||prior(str[i])>prior(s1.top())||str[i]=='('/*||!s1.empty()*/)
{
s1.push(str[i]);
}
else if(!s1.empty()&&str[i]==')')
{
while(!s1.empty()&&(s1.top())!='(')
{
tmp=s1.top();
s2.push(tmp);
s1.pop();
}
s1.pop();
}
else
{
while(!s1.empty()&&(prior(str[i])<=prior(s1.top())))//注意短路原则,要先判断是否为空为空自然不走后面的代码
{ //如果把判断是否为空放优先级判断之后,就会出现栈为空却
tmp=s1.top(); //试图进行top(),pop()操作的情况
s1.pop(); //会出现错误deque iterator not dereferencable
s2.push(tmp); //!所以要把s1.empty的判断放前面
}
s1.push(str[i]); }
}
}
while(!s1.empty())
{
tmp=s1.top();
s1.pop();
s2.push(tmp);
}
}
int cal(int n)
{
return ;
}
int main()
{
int n,i;
scanf("%s",&str); n=strlen(str);
char tmp;
getLast(n);
while(!s2.empty())
{
tmp=s2.top();
s2.pop();
printf("%c",tmp);
}
return ;
}

第二:多线程编程

在多线程编程里面,这种问题也出现的比较多。

两个线程同时访问同一个容器,也会导致出现这种情况。

解决办法:关键代码段。

不建议用互斥内核对象是因为关键代码段是用户层的,调用很快,互斥内核对象调用需要从用户态转入内核态!时间很长!

参考资料:http://blog.csdn.net/midle110/article/details/823858

iterator not dereferencable问题的更多相关文章

  1. BUG_vector iterator not dereferencable

    1问题: bug提示图下图所示:

  2. C++ STL之迭代器注意事项

    1.两个迭代器组成的区间是前闭后开的 2.如果迭代器的有效性,如果迭代器所指向的元素已经被删除,那么迭代器会失效 http://blog.csdn.net/hsujouchen/article/det ...

  3. program files (x86)\microsoft visual studio 14.0\vc\include\xtree,如果没有找到,下标溢出了,就报错咯

    ---------------------------Microsoft Visual C++ Runtime Library---------------------------Debug Asse ...

  4. 学习笔记-C++ STL iterator与对指针的理解-20170618

    vector的itrerator支持random access #include<iostream> #include<vector> using namespace std; ...

  5. 设计模式(十):从电影院中认识"迭代器模式"(Iterator Pattern)

    上篇博客我们从醋溜土豆丝与清炒苦瓜中认识了“模板方法模式”,那么在今天这篇博客中我们要从电影院中来认识"迭代器模式"(Iterator Pattern).“迭代器模式”顾名思义就是 ...

  6. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

  7. [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  8. [LeetCode] Peeking Iterator 顶端迭代器

    Given an Iterator class interface with methods: next() and hasNext(), design and implement a Peeking ...

  9. [LeetCode] Zigzag Iterator 之字形迭代器

    Given two 1d vectors, implement an iterator to return their elements alternately. For example, given ...

随机推荐

  1. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 package com.zdz.test; im ...

  2. 0-5v转0-20ma和0-5v转4-20ma

    0-5v转0-20ma 0-5v转4-20ma

  3. P3435 [POI2006]OKR-Periods of Words

    P3435 [POI2006]OKR-Periods of Words 题解传送门 kmp 注意:由于题目说只要A满足是2Q的前缀,所以求的不是严格的最大循环子串(20pts) 我们需要求出的是在主串 ...

  4. 在一个activity中销毁指定activity

    通过静态变量的方法: 1.在Aactivity中设置一个Activity静态变量 static Activity activity; 2.在onCreate中: activity=this: 3.在B ...

  5. Python3基础 random 配合while输出10个随机整数

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. Python3基础 str title 单词首字母大写,其余均为小写

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. 基于bootstrap的后台管理系统

    ace metro'nic 基于bootstrap的后台admin system ace [eis], 扑克牌中的A 表示 非常棒, 杰出, 顶好的... gallery: 画廊, 走廊; 在网页中常 ...

  8. C++ 清空队列(queue)的几种方法

    C++中的queue自身是不支持clear操作的,但是双端队列deque是支持clear操作的. 方法一 直接用空的队列对象赋值 queue<int> q1; // process // ...

  9. C# 实现简单的 Heap 堆(二叉堆)

    如题,C#  实现简单的二叉堆的 Push() 和 Pop(), 如有不足欢迎指正. 另外,在C#中使用 Heap 的相似功能可以考虑使用:Priority Queues,SortedDictiona ...

  10. DataSet 动态添加列

    public DataSet GetNewId(List<string> IdArr) { DataSet ds = new DataSet(); DataTable newtb = ne ...