c++ - 为什么使用 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
解决方案
首先,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
在多个地方写。
推荐阅读
- javascript - Vue 使用来自 Vue() 的模板和脚本定义组件
- html - 使用变量的 ADA 可访问性错误空标题
- rest - 在 REST 中使用“createModel”是一个好习惯吗?
- c# - 编译期间显示的用户控制错误消息
- google-cloud-platform - Biqquery:某些行属于不同的分区而不是目标分区
- design-patterns - 如何从现有的写入数据库生成 CQRS 中的读取数据?
- javascript - 如何在 react-data-grid 中的行选择中禁用行的复选框
- android - Android Kotlin 应用程序未根据接收到的蓝牙数据显示或隐藏图像
- python - DataTable(JQuery):如何用浏览器语言切换语言?
- java - 玩家控制的 JPanel 对象卡在 JFrame 的某些角落