C++ 调试断言失败:C++;向量下标超出范围
我正在尝试基于堆栈创建一个简单的应用程序,而我的代码在尝试运行它时给出了一个错误。代码如下:C++ 调试断言失败:C++;向量下标超出范围,c++,vector,stdvector,C++,Vector,Stdvector,我正在尝试基于堆栈创建一个简单的应用程序,而我的代码在尝试运行它时给出了一个错误。代码如下: // Stacks.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<iostream> #include<vector> using namespace std; class stackx{
// Stacks.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<vector>
using namespace std;
class stackx{
private:
int top;
vector<double> stackVect;
int maxSize;
public:
stackx(int s): maxSize(s),top(-1){
stackVect.reserve(maxSize);
}
void push(double a){
stackVect[++top]=a;
}
double pop(){
return stackVect[top--];
}
double peek(){
return stackVect[top];
}
bool isEmpty(){
return (top==-1);
}
bool isFull(){
return (top == maxSize-1);
}
};
int main(){
stackx stackvect(6);
stackvect.push(20);
stackvect.push(22);
stackvect.push(13);
stackvect.push(69);
stackvect.push(123);
while(!stackvect.isEmpty()){
double value = stackvect.pop();
cout<<value<<" ";
}
cout<<endl;
return 0;
}
//Stacks.cpp:定义控制台应用程序的入口点。
//
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
stackx类{
私人:
int top;
向量stackVect;
int-maxSize;
公众:
堆栈x(整数s):最大大小,顶部(-1){
stackVect.reserve(最大尺寸);
}
无效推送(双a){
stackVect[++top]=a;
}
双重流行(){
返回stackVect[top--];
}
双峰{
返回stackVect[顶部];
}
布尔是空的{
返回(顶部==-1);
}
bool isFull(){
返回(top==maxSize-1);
}
};
int main(){
stackx-stackvect(6);
堆栈向量推送(20);
堆栈向量推送(22);
堆栈向量推送(13);
堆栈向量推送(69);
堆栈向量推送(123);
而(!stackvect.isEmpty()){
double value=stackvect.pop();
我猜你没有正确使用std::vector
您应该使用而不是stackVect[++p]
,而不是stackVect[p-->
和for peek
至于为什么,原因很简单,因为向量是空的/不是大小为“top”的,访问值将不起作用。stackVect[10000]最多不创建10000个项目,只需访问它即可。如果它不存在,结果将无法预测
在这种情况下,您应该使用which,它也会执行相同的操作,但在无效偏移量时会引发异常。当您使用[]
访问向量时,向量不会自动调整大小,因此
stackVect[++top]=a;
您希望将元素添加到向量的方法是越界访问。您需要使用push_back
等方法将元素添加到向量。但是,在您的代码中,根本不需要top
。请使用向量的大小。例如,isEmpty将定义为
return stackVect.empty();
然后,向量的push_back、pop_back和back方法就是您所需要的。或者更好的方法是使用std::stack
,它内置了所有这些方法(以稍微不同的、异常安全的方式实现pop)。当您在边界之外访问向量时,向量不会调整大小(好吧,可能是由于未定义的行为,但不能以任何方式保证)。向量的reserve
成员函数不会更改向量包含的元素数。它只会更改向量管理的内存量,以便更快地添加新元素。另一方面,resize
成员函数会更改元素数。将调用堆栈升级到您自己的代码。是吗你的意思是调整大小而不是保留?“它说的是第1140行。虽然没有第1140行”,但它可能指的是另一个文件中的第1140行。天哪,这真的是这本书的错。其中的代码使用了reserve
和操作符[]
。太糟糕了。谢谢。默认情况下,我定义的向量的大小是多少?向量最初是空的。好的,谢谢。我明白了,我使用向量时没有定义它的大小。