调试断言失败的c++deque迭代器不可取消引用
Debug Assertion Failed c++ deque iterator not dereferencable
我希望我的代码进行中缀到前缀的更改。当输入是3+5时,输出应该是35+。然而,当我键入"3+5"t时,程序在控制台屏幕上显示3,然后弹出一个错误。Error says"Debug Assertion Failed!…microsoft visual studio10.0\vc\include\dequeline:338Expression:"当我单击"ignore"时,deque迭代器不可取消引用另一个错误弹出"调试断言失败!…microsoft visual studio10.0\vc\include\deque行:339表达式:"标准c++库超出范围"&&0这是我的代码:
#include<iostream>
#include<stack>
#include<string>
#include<locale>
#include<vector>
using namespace std;
决定优先级的函数
int priority(char a)
{
int prio=-1;
if(a=='+'||a=='-')
prio=1;
else if(a=='*'||a=='/')
prio=2;
else if(a=='^')
prio=3;
else if(a=='(')
prio=4;
return prio;
}
void main()
{int i=0,j=0;
int control=0;
string infix;
stack<char> ostack;
vector<char> temp;
cin>>infix;
for(i=0;i<infix.length();i++)
{
如果是一个号码,我想打印
if(isdigit(infix[i]))
{
cout<<infix[i];
}
如果它是一个数学符号,我想检查哪一个
else if(infix[i]=='+' || infix[i]=='-' || infix[i]=='*' || infix[i]=='/' || infix[i]=='^' || infix[i]=='(')
{
if(priority(infix[i])>priority(ostack.top()) || ostack.empty())
{
ostack.push(infix[i]);
}
else if(priority(infix[i])<=priority(ostack.top()))
{
while(!ostack.empty())
{
temp.push_back(ostack.top());
cout<<ostack.top();
ostack.pop();
}
control++;
}
else if(control=1)
{
ostack.push(infix[i]);
}
else if(infix[i]==')')
{
while(ostack.top()!='(')
{
cout<<ostack.top();
ostack.pop();
}
}
}
control=0;
}
while(!ostack.empty())
{
cout<<ostack.top();
ostack.pop();
}
system("pause");
}
问题出现在主函数中的第一个else-if语句处。当我调试时,直到那里都没有问题。但是,当我按下(第35行(第14行))的"Step Into"按钮时,另一个只读文件弹出并显示
reference operator[](size_type _Off)
{ // subscript mutable sequence
#if _ITERATOR_DEBUG_LEVEL == 2
if (this->_Mysize <= _Off)
_DEBUG_ERROR("string subscript out of range");
#elif _ITERATOR_DEBUG_LEVEL == 1
_SCL_SECURE_VALIDATE_RANGE(_Off < this->_Mysize);
#endif /* _ITERATOR_DEBUG_LEVEL == 2 */
return (_Myptr()[_Off]);
}
那。
我更改了for语句的内部,它现在可以工作,但有错误。代码现在看起来是这样的。当我输入3*5-7/9时。输出为35*79/。但应该是35*79/-。
for(i=0;i<infix.length();i++)
{
if(ostack.empty() && !isdigit(infix[i]))
ostack.push(infix[i]);
else if(isdigit(infix[i]))
{
cout<<infix[i];
}
else if(infix[i]=='+' || infix[i]=='-' || infix[i]=='*' || infix[i]=='/' || infix[i]=='^' || infix[i]=='(')
{
if(priority(infix[i])>priority(ostack.top()))
{
ostack.push(infix[i]);
}
else if(priority(infix[i])<=priority(ostack.top()))
{
while(!ostack.empty())
{
temp.push_back(ostack.top());
cout<<ostack.top();
ostack.pop();
}
control++;
}
else if(control=1)
{
ostack.push(infix[i]);
}
else if(infix[i]==')')
{
while(ostack.top()!='(')
{
cout<<ostack.top();
ostack.pop();
}
}
}
control=0;
}
代码中的此条件
if (priority(infix[i]) > priority(ostack.top()) || ostack.empty())
已经是代码被破坏的直接指示。
如果ostack
可能是空的(而且确实存在,因为您正在检查它),那么调用ostack.top()
是非法的。显然,这正是你的代码想要做的
如果你想检查ostack
是否为空,你必须确保在调用ostack.top()
之前,而不是在之后
if (ostack.empty() || priority(infix[i]) > priority(ostack.top()))
按照这个顺序(!),而不是相反。
相关文章:
- CMake:我们可以为一组不形成可执行文件或库的特定文件指定包含目录吗?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 命名空间 std:: 不包含可选
- 为什么结构化绑定不支持可变数组?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- RXCPP:创建一个不关心可观察量输入类型的扩展
- 对于实际指针类型,用于检测类似指针(可取消引用)类型的模板函数失败
- 在 Spirit X3 中使用布尔属性而不是可选属性
- 防御性地应用 std::move 到平凡可复制的类型是否不可取
- 使命令不产生可执行文件
- 我可以定义一个(键入的)常数,该常数确定不占据可执行文件中的空间
- GDB错误不以可执行格式:未识别的文件格式
- 为什么*_leastN_t和*_fastN_t类型是必需的,而不是可选的
- "make"的输出是一个共享对象,而不是可执行文件
- 运算符重载:简单添加...错误 C2677:二进制"+":未找到采用类型 ___ 的全局运算符(或者不存在可接受的转换)
- 在 Visual C++ 系统调用的路径中找不到可执行文件
- Eclipse Ubuntu 中的“程序不是可识别的可执行文件”错误
- 数组迭代器不是可取消引用的错误
- 迭代器不是可取消引用的堆栈(表达式树)和循环无法正常工作
- 列出迭代器而不是可取消引用的运行时