0

我正在尝试将大量值读入特定函数中的向量,然后将其调用到 main 中以获取平均值。我的 readInput 工作得很好。但我相信当我 cout << values.size(); 时我的主函数返回 0。为什么是这样?我能做些什么来改变它?

using namespace std;
//function prototype
int readInput(vector<int> vect);


int main()
{
vector<int> values;
int sum, avg;
sum = readInput(values);

//cout << sum;

avg = sum / values.size();
cout << avg;

return 0;
}

int readInput(vector<int> vect)
{

int count;
int total = 0;

 ifstream inputFile("TopicFin.txt"); //open file

 if(!inputFile)
{
    return 0; // if file is not found, return 0
}

 while(inputFile >> count) //read file
 vect.push_back(count); //add to file

 for (int count = 0; count < vect.size(); count++)
 total+=vect[count]; //sum data in vector

return total;

}
4

3 回答 3

2

您没有通过引用传递向量,因此您的函数仅将值存储在main 的向量副本中。

int readInput(vector<int>& vect);

这告诉您的程序通过引用传递向量,这意味着函数中修改的任何内容都会直接修改 main 中的向量。如果您不熟悉这些东西,请查看这篇解释参考和副本之间区别的帖子。

于 2013-11-07T18:00:32.897 回答
0

尽管其他人已经提到了通过引用传递向量的可能性,但认为在这种情况下我不会这样做。我想我只是从函数中返回向量。我还将文件名传递给函数:

std::vector<int> values = readInput("TopicFin.txt");

至少对我来说,这似乎更好地反映了意图。也许我只是有点慢,但从名称上看,它的返回值似乎并不明显是readInput它读取的值的总和。

虽然返回向量理论上可能会导致编译器出现效率问题,该编译器既不支持移动构造也不支持返回值优化,但几乎可以保证任何这样的编译器都非常古老,以至于您出于其他原因真的想避免它。

就将数据读入向量而言,我会使用一对istream_iterators:

std::vector<int> data{std::istream_iterator<int>(infile),
                      std::istream_iterator<int>()};

当然,考虑到这很简单,我倾向于想知道是否值得拥有一个单独的函数readInput

为了总结这些值,我会使用std::accumulate

int total = std::accumulate(data.begin(), data.end(), 0);
于 2013-11-07T18:10:29.993 回答
0

您需要将向量作为引用或指针传递。该函数只是创建当前按值传递的向量的副本,并对其进行操作。

将函数签名更改为 . . .

int readInput(vector<int>& vect)

或者(对于这个例子来说可能更奇怪)。..

int readInput(vector<int> *vect)

还将函数调用更改为

sum = readInput(&values);
于 2013-11-07T18:01:57.653 回答