如何将数组传递给函数,以使在该函数中更改数组的值时原始数组的值不变?

时间:2018-06-29 12:12:13

标签: c++ arrays function

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 :(得分:7)

  

有什么方法可以将数组传递给函数,以便在执行函数中的任何操作时都不会更改原始数组?

我能想到的选择:

  1. 在函数中复制数组并修改副本。保持输入数组不变。

  2. 按值传递std::vector。对参数的任何更改都不会影响调用函数中的对象。

  3. 如果在编译时知道数组的大小,请按值传递std::array。对参数的任何更改都不会影响调用函数中的对象。

答案 1 :(得分:1)

R Sahu的回答所示,如果您不想进行复制,则在标准的约束范围内您无能为力。

但是,您可以在其他数据结构中跟踪更改。可能是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;
}