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
操作符[]
。太糟糕了。谢谢。默认情况下,我定义的向量的大小是多少?向量最初是空的。好的,谢谢。我明白了,我使用向量时没有定义它的大小。