调试断言失败:c++ vector下标超出范围

Debug assertion failed: C++ vector subscript out of range

本文关键字:下标 范围 vector c++ 断言 失败 调试      更新时间:2023-10-16

我试图使一个简单的应用程序基于堆栈和我的代码是给一个错误,当我试图运行它。代码在这里:

// 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;
}

我哪里出错了

使用[]访问vector时不会自动调整大小,因此代码

stackVect[++top]=a;

是越界访问,您希望向vector添加一个元素。您需要使用像push_back这样的方法来向向量添加元素。但是,在代码中根本不需要top。而是使用向量的大小。例如,isEmpty将被定义为

return stackVect.empty();

那么你所需要的就是vector的push_back、pop_back和back方法。或者更好的是,使用std::stack,它内置了所有这些功能(以略微不同的异常安全的方式实现pop)。

我猜你没有正确使用std::vector。

你应该用push_back代替stackVect[++p],用pop_back代替stackvect[p--],用back代替peek。

至于原因,很简单,因为vector是空的/不是top大小的,访问一个值将不起作用。stackVect[10000]不创建多达10000个项目,只是访问它。如果不存在,结果是不可预测的。

在这种情况下,您应该使用at which做同样的事情,但会在无效偏移量时抛出异常。