Передача вектора по ссылке по значениям не меняется в исходном векторе, который передается? - PullRequest
0 голосов
/ 11 июля 2019

Я практикую указатели функций в C ++.Я написал следующий код.Я объявил целочисленный вектор и добавил значения к нему.После этого я передаю значения вектора в функцию по ссылке.Я добавляю значение к каждому значению вектора.После этого при отображении содержимого исходного вектора значения не меняются.Ниже приведен код.

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 Ответ

4 голосов
/ 11 июля 2019

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 для передачи по доступной для записи ссылке.
  • в вашем цикле вы можете использовать auto: for (auto & value : values) (также адаптируется к const), поэтому, если тип меняется, вам не нужно менять ваш цикл.
...