提问者:小点点

数组插入L值、R值


这只是出于好奇,而我当时正在练习数组插入以图好玩。下面的代码中有一个问题,为什么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<<" ";
    }
}

共1个答案

匿名用户

“逻辑上他们也是这样做的”

否--第一个版本用相同的数字(数组中的最后一个)填充数组中受影响的部分。第二个将数字向上洗牌,为value留出空间。

用笔和纸手动执行循环,您将看到第一个版本向下复制相同的值,直到pos

您还可以通过访问arrout 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];
}