通过参考值传递矢量不会在传递的原始矢量中发生变化?

时间:2019-07-11 11:40:00

标签: c++ stl function-pointers pass-by-reference

我正在用C ++练习函数指针。我写了下面的代码。我已经声明了一个整数向量并为其添加了值。之后,我通过引用将vector的值传递给函数。我将值添加到向量的每个值。之后,当我显示原始向量的内容时,值不会更改。以下是代码。

void printValues (int val) {

    cout << val << " ";

}

void ForEach (vector<int> values, void (* func )(int), int inc) {

    for (int value : values) {
        value = value + inc;
        func (value);
    }
}

int main() 
{   
    vector<int> v1;
    cout << "Please enter the values in vector";
    for (int i = 0; i < 5; i++) {
        int val = 0;
        cin >> val;
        v1.push_back(val);
    }



    cout << "value stored in vector :" ;
        ForEach(v1, printValues,8);

    cout << "\nThe content of original vector:";
    for (int i = 0; i < v1.size(); i++) {
        cout << " " << v1[i];
    }



}

我希望输出为58、68、78、88、98,但实际输出为50、60、70、80、90。

1 个答案:

答案 0 :(得分:4)

vector<int> values不是通过引用传递参数,而是通过值传递参数。循环也有同样的问题(使用int value,您也将进行复制)。使用&

void ForEach (vector<int> &values, void (* func )(int), int inc) { // reference for the parameter

    for (int & value : values) {  // reference for the loop
        value += inc;
        func (value);
    }
}

放在一边:

  • 请勿使用using namespace std。请在各处使用std::vector
  • 每次您看到void ForEach (std::vector<int> values,中的函数参数时,都想知道数据是“输入”还是“输出”。如果是“输入”,请使用常量引用const std::vector<int> &values避免复制并防止同时修改,如果它是“输出”,请执行std::vector<int> &values以通过可写引用传递。
  • 在循环中,您可以使用autofor (auto & value : values)(也将适用于const),因此,如果类型更改,则不必更改循环。