首页 > 解决方案 > 为什么使用 std::sort() )给我垃圾值?

问题描述

我试图解决一个必须排序的问题,所以我使用了标准库std::sort函数,但在第二个测试用例中得到了错误的输出:

#include <bits/stdc++.h> 

using namespace std;

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,i;
        cin>>n;
        int arr[n-1];

        for(i=1;i<=n-1;i++)
            cin>>arr[i];

        int size=sizeof(arr)/sizeof(arr[1]);
        sort(arr,arr+size); 

        for(i=1;i<=n-1;i++)
            cout<<arr[i]<<" ";

        cout<<endl;         
    }
    return 0;
}

进出口:

2
5
1 2 5 4  
10
1 2 3 4 5 6 7 8 10

预期的 O/P:

1 2 4 5
1 2 3 4 5 6 7 8 10

实际O/P:

1 2 4 5
2 3 4 5 6 7 8 2013562 10

标签: c++arrayssorting

解决方案


首先,int arr[n-1];是一个变长数组。这实际上不是 C++ 的一部分,尽管有些编译器会容忍它。在大多数情况下,您可以直接使用std::vector<int>(n-1);

但是看看这个循环:

for(i=1;i<=n-1;i++)
    cin>>arr[i];

您从 开始1并一直到n-1,但是您的数组从arr[0]arr[n-2]。因此,您得到了未定义的行为,因为您正在写入一个超出数组大小的内容,并且您也没有写入第一个位置(当您尝试使用仍然存在的未初始化值进行排序时,会导致更多未定义的行为)。

相反,循环应该for(i=0;i<n-1;i++)同样适用于您打印它的位置。然后,您可以通过以下方式对向量进行排序:

sort(arr.begin(), arr.end());

另请注意,通过这样做,n-1您总是在读取并处理用户输入的少一个值,我不确定这是否是您的意图。如果你想这样,你也可以n在读完后减一,而不是n-1在多个地方写。


推荐阅读