Сбой утверждения C++ для вектора во время выполнения. Выражение: индекс вектора вне допустимого диапазона.

я получаю это действительно раздражающее сообщение об ошибке. Я знаю, что я только новичок в этом, но, похоже, я мог бы понять. Может ли кто-нибудь показать мне, где я ошибаюсь, пожалуйста?

Сообщение во время выполнения: Ошибка подтверждения отладки! Программа: .... Файл: c:\program files\microsoft visual studio 10.0\vc\include\vector Строка: 932 Выражение: Индекс вектора вне допустимого диапазона

и код

#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)
{
}

person Tanya Tazzy Hegarty    schedule 20.04.2011    source источник
comment
У нас нет номеров строк, поэтому было бы полезно указать, что это за строка.   -  person rerun    schedule 21.04.2011
comment
Нет номера строки, это ошибка времени выполнения, извините, нужно было упомянуть об этом   -  person Tanya Tazzy Hegarty    schedule 21.04.2011
comment
@Tanya - При вызове какого метода происходит ошибка утверждения?   -  person Mahesh    schedule 21.04.2011
comment
Хотел бы я знать, вот почему я дал вам весь код cpp, потому что это окно с сообщением об ошибке, которое появляется, когда я пытаюсь его запустить.   -  person Tanya Tazzy Hegarty    schedule 21.04.2011
comment
Вы должны попытаться использовать отладчик, чтобы найти вызов метода, который запускает утверждение. Как инициализируется numberVector, кстати? Достаточно ли долго использовать оператор нижнего индекса в VectorIntStorage::Read(..)?   -  person evnu    schedule 21.04.2011
comment
как std::vector‹int› numberVector;   -  person Tanya Tazzy Hegarty    schedule 21.04.2011
comment
@Tanya - Как вы инициализируете размер numberVector равным NumberOfInts ?   -  person Mahesh    schedule 21.04.2011
comment
с r ›› NumberOfInts я думаю, о боже, я не могу вспомнить, должен ли я как-то их инициализировать?   -  person Tanya Tazzy Hegarty    schedule 21.04.2011


Ответы (3)


У нас недостаточно информации, чтобы сказать наверняка, но я подозреваю, что ошибочная строка — r >> numberVector[i]. Я полагаю, вы хотели сказать int j; r >> j; numberVector.push_back(j);

Проблема именно в том, что говорится в сообщении об ошибке: индекс вашего вектора (i) вне допустимого диапазона. В частности, вы никогда не увеличиваете размер вашего вектора, поэтому он всегда имеет размер 0. Таким образом, любое использование operator[] будет ссылаться на элемент вне диапазона.

person Robᵩ    schedule 20.04.2011
comment
Помимо этой причины, может ли эта ошибка появиться, когда произошла утечка памяти? - person Samitha Chathuranga; 20.09.2015

Вы не можете просто использовать 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]
person Erik    schedule 20.04.2011

r >> NumberOfInts; //gets number of ints for vector

Из приведенного выше комментария кажется, что вам нужен вектор размером NumberOfInts. Но оставив строку как прокомментировано -

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

Вы объявляете вектор как -

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

Чтобы выполнить операцию [] над numberVector, необходимо указать его размер и он должен находиться в допустимом диапазоне при объявлении. Поскольку это не упоминается при объявлении, вам нужно выполнить операцию push_back для динамического увеличения размера вектора.

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;
    // ....
person Mahesh    schedule 20.04.2011