这只是出于好奇,而我当时正在练习数组插入以图好玩。下面的代码中有一个问题,为什么a[i]=a[i+1]
给我一些垃圾值,但将其设置为a[i+1]=a[i]
就解决了这个问题。逻辑上他们也是这样做的,但我只是想知道它是否与L值和R值引用有关?
#include<iostream>
#include<array>
using namespace std;
int main()
{
int pos,value;
std::array<int,10> arr{1,2,3,4,5,6,7,8,9};
for (int i:arr){
cout<<i<<" ";
}
std::cout<<"\n";
cin>>value>>pos;
for(int i=arr.size()-1;i>=pos;i--){
arr[i]=arr[i+1];
}
arr[pos]=value;
for (int i:arr){
cout<<i<<" ";
}
}
#include<iostream>
#include<array>
using namespace std;
int main()
{
int pos,value;
std::array<int,10> arr{1,2,3,4,5,6,7,8,9};
for (int i:arr){
cout<<i<<" ";
}
std::cout<<"\n";
cin>>value>>pos;
for(int i=arr.size()-1;i>=pos;i--){
arr[i+1]=arr[i];
}
arr[pos]=value;
for (int i:arr){
cout<<i<<" ";
}
}
“逻辑上他们也是这样做的”
否--第一个版本用相同的数字(数组中的最后一个)填充数组中受影响的部分。第二个将数字向上洗牌,为value
留出空间。
用笔和纸手动执行循环,您将看到第一个版本向下复制相同的值,直到pos
。
您还可以通过访问arr
out of bounds来启动这两个循环,这使得两个版本都具有未定义的行为。
我怀疑你想让这个版本的数字往上移动:
for(int i=arr.size()-2; i>=pos; --i) { // -2 since i+1 must be less than size()
arr[i+1]=arr[i];
}