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()
,该函数执行了一些修改。问题是修改也反映在原始数组上。有什么方法可以将数组传递给函数,以便在执行函数中的任何操作时都不会更改原始数组?
答案 0 :(得分:7)
有什么方法可以将数组传递给函数,以便在执行函数中的任何操作时都不会更改原始数组?
我能想到的选择:
在函数中复制数组并修改副本。保持输入数组不变。
按值传递std::vector
。对参数的任何更改都不会影响调用函数中的对象。
如果在编译时知道数组的大小,请按值传递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;
}