函数填充向量,但它在某个时刻变为空

Function fills vector yet it becomes empty at some point.

本文关键字:时刻 向量 填充 函数      更新时间:2023-10-16

我遇到了一个奇怪的问题。我试图用一个函数填充向量,然后用另一个函数输出它。即使在函数被调用后,向量也会显示为空,我相信它是正确填充的。这是我迄今为止的代码。结果是

"在.txt中输入输入文件名在矢量中搜索在抛出"std::out_of_range"的实例后调用terminatewhat():矢量::_M_range_check中止(堆芯转储)"

    #include <iostream>
    #include <cassert>
    #include<vector>
    #include "ArrayUtilities.h"

    using namespace std;
    void fillArray(istream& io, std::vector<int> a, int& actualSize)
    {
       int temp,i=0;
       io>>temp;
       while (temp!=-999)
       {
       a.push_back(temp);
           io>>temp;
           i++;
       }
       actualSize=i;
    }

    void outputArray(ostream& os,
            std::vector<int> a,
            const int actualSize,
            const string& info )
    {
os<<info<<"n";
for (int w=0;w<actualSize;++w)
{
    os<< a.at(w)<<" ";
}
os<<"n";
}

int main(){

int actualSize;
string fileName;
string info;

std::vector<int> a;
cout << "Enter the input file name ";
cin  >> fileName;
ifstream inData;
ofstream outData;
inData.open(fileName.c_str());
outData.open("out.txt");
int searchItem;
inData>>info;
inData>>searchItem;
fillArray  (inData,  a, actualSize);
cout   <<"Search in vectorn";
outData<<"Search in vectorn";
    outputArray(outData, a, actualSize, info);
outputArray(cout,    a, actualSize, info);
//sequential search
int position;
position=seqSearch(a,actualSize,searchItem);
if (position > 0)
    {
        cout    << "Sequential Search: SearchItem "
                << searchItem
                << " is on position "
                << position
                << "n";
        outData << "Sequential Search: SearchItem "
                << searchItem
                << " is on position "
                << position
                << "n";
    }
    else
    {
        cout    << "Sequential Search: SearchItem "
                << searchItem
                << " is not in the listn";
        outData << "Sequential Search: SearchItem "
                << searchItem
                << " is not in the listn";
    }

感谢您的帮助

您的函数有一个向量的本地副本。它不会影响作为参数传递的向量。您可以通过传递对向量的引用来解决此问题:

void fillArray(istream& io, std::vector<int>& a, int& actualSize)
//                                          ^

juancopanza显示了代码中的错误。我会换一种风格。

将fillArray更改为:

std::vector<int> fillArray(istream& io)
{
   std::vector<int> response;
   int temp;
   io>>temp;
   while (temp!=-999) {
       response.push_back(temp);
       io>>temp;
   }
   return response;
}

主要用途:

int main()
{
    int actualSize;
    string fileName;
    string info;
    std::vector<int> a;
    cout << "Enter the input file name ";
    cin  >> fileName;
    ifstream inData;
    ofstream outData;
    inData.open(fileName.c_str());
    outData.open("out.txt");
    int searchItem;
    inData>>info;
    inData>>searchItem;
    a = fillArray(inData);
    // If you really like actualSize add
    actualSize = a.size();
    cout   <<"Search in vectorn";
    outData<<"Search in vectorn";
        outputArray(outData, a, a.size(), info);
    ...
}

从本质上讲,我觉得它更容易阅读。根据Chandler Carruth的这篇演讲,更容易优化。