更新的矢量元素不打印

Posted

技术标签:

【中文标题】更新的矢量元素不打印【英文标题】:Updated vector elements do not print 【发布时间】:2020-02-17 06:21:34 【问题描述】:

在替换小于第一个和最后一个元素的平均值的元素后,下面的代码不会打印更新的向量元素。

如何改进此代码,用户输入指定长度的数组并将每个小于第一个和最后一个元素的平均值的元素替换为平均值。

有没有更好的方法将向量传递给函数,或者更有效的方法来管理内存?

#include <iostream>
#include <vector>

std::vector<double> getData()

    int n;
    std::vector<double> intputData;
    std::cout << "Enter array length\n";
    std::cin >> n;
    std::cout << "Enter the numbers\n";
    for(int i = 0; i < n; i++)
        int tmpIn;
        std::cin >> tmpIn;
        intputData.push_back(tmpIn);
    
    return intputData;



void modifyData(std::vector<double> &data_mo)

    double f=data_mo[0];
    double l=data_mo[data_mo.size() - 1];
    double av = (f + l)/2;
    for (auto j: data_mo)
    
        if(j < av)
            j = av;
        
    


void printData(std::vector<double> &data_pr)

    for (auto i: data_pr)
    
        std::cout << i << " ";
    
    std::cout << '\n';


int main()

    std::vector<double> data_ma = getData();
    modifyData(data_ma);
    printData(data_ma);

    return 0;

【问题讨论】:

【参考方案1】:

modifyData 需要基于范围的for 循环来通过引用修改元素,否则您的修改是在元素的副本而不是元素本身上起作用。

改变

for (auto j: data_mo)

for (auto &j: data_mo)

另外,一个简单的改进是让printData 通过 const 引用获取它的参数,因为向量不会改变。

void printData(const std::vector<double> &data_pr)

【讨论】:

我假设通过引用传递 inputData 到 modifyData 足以正确更新元素,为什么不是这样? 如何将参数传递给函数,以及如何在函数内部使用它是两件不同的事情。您对auto 的使用默认type deduction 持有该元素的副本。 使用 std::span 将向量容器传递给每个函数有什么好处? 此外,在基于范围的 for 循环中,在 auto 之前添加 const 限定符有什么好处? @DarnocEloc 我认为在这里使用std::span 没有任何好处(当它可用时),因为它不是它的预期用途,没有它会更清晰。请使用const 作为printData 的循环,不要将其用于modifyData。前者不应该修改元素,后者应该是故意的。

以上是关于更新的矢量元素不打印的主要内容,如果未能解决你的问题,请参考以下文章

如何打印成对矢量数组的元素?

打印矢量元素

使用自动变量打印矢量的内容

如何更新矢量或地图的值

使用R中的稀疏矩阵从矢量中提取元素,而不转换为密集矩阵

一般打印光栅和/或矢量图像