我即将参加c ++考试,因此我决定通过编写一个随机程序进行学习,该程序将实现迄今为止该课程所涵盖的大部分材料。我想到的是一个程序,该程序从输入文件中读取数值数据,将其复制到向量中,通过一些自定义函数执行一些计算,将向量从最低值到最高值进行排序,并在标准输出中显示数据。
除排序功能外,一切都正常。我似乎无法弄清楚如何更改向量的值。运行程序时,矢量元素保持其原始顺序。我很确定我需要引用该向量,以便该函数能够更改实际数据,但是我不知道该如何正确地执行操作。
这是代码(需要一个名为“ input.txt”的文件才能工作):
#include <iomanip>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
void icountSumAvg(vector<double>, int, int &icount, double &sum, double &avg);
void display(int, double, double);
void display(int, double, double, vector<double>, int);
void swap(vector<double>, int);
int main()
{
ifstream ifile;
const string FILENAME = "input.txt";
ifile.open(FILENAME);
int count = 0;
double sum = 0, avg = 0;
if (!(ifile.fail()))
{
bool testSwap = true; // displays each element if true
vector<double> vect;
double value = 0.0;
while (!ifile.eof())
{
ifile >> value;
vect.push_back(value);
}
int vectSize = vect.size();
icountSumAvg(vect, vectSize, count, sum, avg);
if (testSwap == true)
{
swap(vect, vectSize);
display(count, sum, avg, vect, vectSize);
}
else
display(count, sum, avg);
ifile.close();
}
else
cout << "There was an error opening the file: " << FILENAME << endl;
system("pause");
}
void icountSumAvg(vector<double> values, int size, int &icount, double &sum, double &avg)
{
for (int i = 0; i < size; i++)
{
icount++;
sum += values[i];
}
avg = sum / icount;
}
void swap(vector<double> values, int size)
{
double temp;
for (int i = 0; i < size; i++)
{
for (int j = 0; j < i; j++)
{
if (values[j] < values[i])
{
temp = values[i];
values[i] = values[j];
values[j] = temp;
}
}
}
}
void display(int count, double sum, double avg, vector<double> values, int size)
{
for (int i = 0; i < size; i++)
{
cout << "Element " << i + 1 << ": " << values[i] << endl;
}
cout <<"Total count: " << count << endl
<< "Total sum: " << sum << endl
<< "Average of numbers: " << avg << endl;
}
void display(int count, double sum, double avg)
{
cout <<"Total count: " << count << endl
<< "Total sum: " << sum << endl
<< "Average of numbers: " << avg << endl;
}
答案 0 :(得分:2)
您是swap()函数,仅修改复制到该函数的向量。通过引用swap()函数发送向量以获得所需效果。这样也可以避免多余的复制。
由于icountSumAvg()和display()不应修改vector参数,因此也应将它们声明为const引用:
text
答案 1 :(得分:1)
在swap
函数中,values函数没有收到指向矢量对象的指针/引用,因此接受该对象的副本,并且由于该方法无效,因此您只是在更改不复制对象本身。