运行时vector断言失败表达式:vector下标超出范围

C++ Assertion Failed on vector at runtime Expression: vector subscript out of range

本文关键字:vector 范围 下标 表达式 断言 失败 运行时      更新时间:2023-10-16

我收到这个非常烦人的错误消息。我知道我是新手,但这似乎是我能弄明白的事情。谁能告诉我我哪里错了?

运行时的消息是:调试断言失败!计划:....文件:c:program filesmicrosoft visual studio 10.0vcincludevector线:932表达式:Vector下标超出

,代码是

#include "VectorIntStorage.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
void VectorIntStorage::Read(istream& r)
{
    char c[13];
    r >> c;
    r >> NumberOfInts; //gets number of ints for vector
    //numberVector = new std::vector<int> numberVector;
    for(int i = 0; i < NumberOfInts; i++)
    {
        r >> numberVector[i];
        cout << numberVector[i] << endl;
        if(_sortRead) //true
        {
            for(int k = 0; k < i; k++)
            {
                if(numberVector[i] < numberVector[k])
                {
                    int temp = numberVector[k];
                    numberVector[k] = numberVector[i];
                    numberVector[i] = temp;
                }
            }
        }
    }
}
void VectorIntStorage::Write(ostream& w)
{
    for(int i = 0; i < NumberOfInts; i++)
    {
        w << numberVector[i] << endl;
        cout << numberVector[i] << endl;
    }
}
void VectorIntStorage::sortStd()
{
    sort(numberVector.begin(), numberVector.end());
}
void VectorIntStorage::sortOwn()
{
    quickSort(0, NumberOfInts - 1);
}
void VectorIntStorage::setReadSort(bool sort)
{
    _sortRead = sort;
}
void VectorIntStorage::quickSort(int left, int right)
{
     int i = left, j = right;
      int tmp;
      int pivot = numberVector[(left + right) / 2];
      while (i <= j)
      {
            while (numberVector[i] < pivot)
                  i++;
            while (numberVector[j] > pivot)
                  j--;
            if (i <= j) 
            {
                  tmp = numberVector[i];
                  numberVector[i] = numberVector[j];
                  numberVector[j] = tmp;
                  i++;
                  j--;
            }
      }
      if (left < j)
      {
            quickSort(left, j);
      }
      if (i < right)
      {
            quickSort(i, right);
      }
}
VectorIntStorage::VectorIntStorage(const VectorIntStorage& copying)
{
    //int *duplicate = new int[(copying.NumberOfInts)];
    //vector<int> *duplicate = new vector<int>;
    //std::copy(numberVector.begin(), numberVector.end(), duplicate);
    //numberVector = duplicate;
    //NumberOfInts = copying.NumberOfInts;
}
VectorIntStorage::VectorIntStorage(void)
{
}

VectorIntStorage::~VectorIntStorage(void)
{
}

我们没有足够的信息来确定,但我怀疑失败的行是r >> numberVector[i]。我想你的意思是说int j; r >> j; numberVector.push_back(j);

问题正是错误消息所说的:您的矢量下标(i)超出了范围。具体来说,你永远不会增加向量的大小,所以它的大小总是0。因此,operator[]的任何使用都将引用超出范围的元素。

你不能只使用numberVector[i]而不先调用numberVector.resize()

vector<int> vec;
vec[1] = 0; // fails - vec is empty so [1] is out of range
vec.resize(100);
vec[1] = 5; // ok, you can access vec[0] .. vec[99] now
vec.push_back(11); // Now the size is 101 elements, you can access vec[0] .. vec[100]
r >> NumberOfInts; //gets number of ints for vector

从上面的评论,似乎你需要一个大小为NumberOfInts的向量。但是留下一行注释-

//numberVector = new std::vector<int> numberVector;

你将vector声明为-

std::vector<int> numberVector; // The size of the vector is 0

要在numberVector上执行[]的操作,它的大小应该被提及,并且应该在while声明的有效范围内。由于没有提到while声明,因此需要执行push_back操作来动态地增加vector的大小。

for(int i = 0; i < NumberOfInts; i++)
{
    r >> numberVector[i];    // Size isnot initially mentioned while declaration 
                             // of the vector to do an `[]` operation
    cout << numberVector[i] << endl;
    // ....