如何解决错误'std :: out_of_range'what():_ M_range_check,vector将接受值,直到被告知要打破

时间:2015-12-04 13:22:54

标签: c++ vector

您好我正在尝试创建一个非常简单的矢量程序来接受整数,然后在提示时,以c ++显示最大的。然而,我是新手,不可避免地做了一件事。如上所述,它抛出错误'std :: out_of_range'what():_ M_range_check,并且在提示中断之前接受值。但即使在浏览了这个论坛很长一段时间后,我也无法弄清楚原因。在此先感谢您的帮助。

#include <iostream>
#include <vector>

using namespace std;

int inputVector (vector<int>);   //prototype functions
void sortVector    (int,vector<int>&files);
void displayVector (vector<int>&files);

int main()
{
    int vectorsize=(0);

    vector <int>files;

    files.reserve(10);

    vectorsize=inputVector (files);

    sortVector (vectorsize, files);

    displayVector (files);

    return 0;

}

void displayVector(vector<int>& files)
{

    cout << " The largest file size is " << files.at(0);

}

int  inputVector(vector<int>files)
{
    int file=0;
    int vectorsize;

    cout << "Enter file sizes  in Megabytes, file size has to be 1 or greater,                                                hit 0 to display max value " << endl;

    do
    {
        cin >> file;

        if (file==0)
        {
            break;
        }

        else
        {
            files.push_back(file) ; //sends value to the vector

            cout << files.size() << endl;
        }
    }
    while (file>0);

    vectorsize=files.size();
    return vectorsize;

}

void sortVector(int vectorsize,vector<int>&files)
{
    int maximum;

    for( int j=0;j<vectorsize;j++)
    {
        for(int i=0;i<(vectorsize-1);i++)
        {
            if(files.at(i)< files.at(i+1))
            {
                maximum=files.at(i);
                files.at(i)=files.at(i+1);
                files.at(i+1)=maximum;
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

inputVector按值获取向量,因此它正在修改副本。通过引用传递它。此外,您无需传递矢量大小,因为您只需拨打size()

答案 1 :(得分:0)

您的vectorsize错了,因此您的电话

files.at(i);  // in sortvector()

导致超出范围的错误。实际的矢量大小为0,但您的程序假设了其他内容。这是因为将vector by值传递给函数vectorinput():在返回该函数时,原始向量未被更改,返回的vectorsize无意义。

做你想做的事情,而不是

#include <iostream>
#include <vector>
#include <algorithm>

void inputVector (vector<int>&);

int main()
{
  vector<int> files;
  inputVector(files);
  // std::sort(files.begin(),files.end(),std::greater<int>()); // not needed
  std::cout << " The largest file size is "
            << std::max_element(files.begin(),files.end()) << std::endl;
}

void inputVector(vector<int>&files)
{
  std::cout << "Enter file sizes in Megabytes, file size has to be 1 or "
               "greater, enter 0 to display max value " << std::endl;
  files.reserve(10); // not really needed
  while(true) {
    int file;
    std::cin >> file;
    if (file>0) {
      files.push_back(file);
      // std::cout << files.size() << std::endl; // for debugging
    } else
      break;
  }
}

但是,当然,如果您只想找到最大值,则无需将文件大小存储在矢量中。