如何通过将向量元素传递给函数来更改它们

Posted

技术标签:

【中文标题】如何通过将向量元素传递给函数来更改它们【英文标题】:how to change vector elements by passing them to a function 【发布时间】:2019-11-14 05:18:31 【问题描述】:

我很快就要参加 c++ 考试了,所以我决定通过编写一个随机程序来学习,该程序将实现目前课堂上所涵盖的大部分材料。我想出的是一个程序,它从输入文件中读取数值数据,将其复制到向量中,通过一些自定义函数执行一些计算,将向量从最低值到最高值排序,并在标准输出中显示数据。

一切正常,除了排序功能。我似乎无法弄清楚如何更改向量的值。运行程序时,矢量元素保持其原始顺序。我很确定我需要引用向量才能使函数能够更改实际数据,但我不知道如何正确地这样做。

这是代码(它需要一个名为“input.txt”的文件才能工作):

https://pastebin.com/5Q8GP3mY

#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;

【问题讨论】:

我看到你已经学会了通过引用传递。暗示。提示。 我知道我应该通过引用传递,但在尝试了几件事后我无法弄清楚。 【参考方案1】:

你的 swap() 函数只是修改复制到函数的向量。通过引用 swap() 函数发送向量以获得期望的效果。这也将避免额外的复制。

由于 icountSumAvg() 和 display() 不应该修改向量参数,因此也将它们声明为 const 引用,如下所示:

void swap(vector<double>&, int);
void icountSumAvg(const vector<double>&, int, int &icount, double &sum, double &avg);
void display(int, double, double, const vector<double>&, int);

【讨论】:

【参考方案2】:

swap 函数中,values 函数不接收指向向量对象的指针/引用,因此接受对象的副本,并且由于方法无效,您只是更改副本的值而不是对象本身。

【讨论】:

以上是关于如何通过将向量元素传递给函数来更改它们的主要内容,如果未能解决你的问题,请参考以下文章

通过指针或引用将映射传递给函数?

传递给函数的向量没有被修改

传递给函数后向量的大小发生变化

如何将向量传递给函数?

在函数中传递向量元素[关闭]

如何在Rust中修改向量的元素?