Как передать массив в функцию, чтобы значение исходного массива не изменялось при изменении значений массива в этой функции? - PullRequest
0 голосов
/ 29 июня 2018
using namespace std;
#include<iostream>
int passarr(int b[],int s)
{
   //Some Modification in the array b
    b[0]=0;
    b[s-1]=0;

    //Printing the array b
    for(int i=0;i<s;i++)
    {
        cout<<b[i]<<" ";
    }
    cout<<endl;
}
int main()
{
    int arr[100];
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>arr[i];
    }

    //Function call and passing array a to the function`
    passarr(arr,n);

    //Printing the array arr
    for(int i=0;i<n;i++)
    {
        cout<<arr[i]<<" ";
    }
}

В этом коде я передал массив arr в функцию passarr(), которая выполняет некоторые модификации. Проблема в том, что модификации отражаются и на исходном массиве. Есть ли способ передать массив функции, чтобы исходный массив не изменялся при выполнении какой-либо операции в функции?

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Как указано в ответе R Саху , если вы не хотите делать копию, вы не можете многое сделать в рамках ограничения Стандарта.

Однако вы можете отслеживать свои изменения в другой структуре данных. Возможность будет std:map<class key, class value>:

  • Ключом карты будет индекс массива типа int
  • Значение - это измененное значение вашего исходного массива.

С этого момента вам нужно только выполнить условную проверку, присутствует ли индекс массива на карте. Это можно сделать с помощью 'std :: map :: find' . Таким образом:

  • Если индекс массива находится в std::map, вернуть значение в std::map
  • Если индекс массива отсутствует в std::map, вернуть исходное значение массива

Если вы выполняете последовательный обход массива, это можно ускорить, используя свойство обхода карты. В представленном примере это может быть:

 int passarr(int b[],int s) {
    std::map<int,int> mod;
    std::map<int,int>::iterator it;

    //Some Modification in the array b
    mod[0]=0;
    mod[s-1]=0;

    //Printing the array b
    it=mod.begin();
    for(int i=0;i<s;i++) {
        if (i == it->first) {
           std::cout << it->second << " ";
           it++;
        else { std::cout<<b[i]<<" "; }
    }
    std::cout<<endl;
}
0 голосов
/ 29 июня 2018

Есть ли способ передать массив функции, чтобы исходный массив не изменялся при выполнении какой-либо операции в функции?

Выбор, который я могу придумать:

  1. Сделайте копию массива в функции и измените копию. Оставьте входной массив без изменений.

  2. Передать std::vector по значению. Любые изменения в аргументе не влияют на объект в вызывающей функции.

  3. Если вы знаете размер массива во время компиляции, передайте std::array по значению. Любые изменения в аргументе не влияют на объект в вызывающей функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...