首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么使用std::sort()会得到无用的值?

为什么使用std::sort()会得到无用的值?
EN

Stack Overflow用户
提问于 2019-07-08 15:21:12
回答 1查看 296关注 0票数 1

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

代码语言:javascript
运行
复制
#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;
}

I/P:

代码语言:javascript
运行
复制
2
5
1 2 5 4  
10
1 2 3 4 5 6 7 8 10

预期O/P:

代码语言:javascript
运行
复制
1 2 4 5
1 2 3 4 5 6 7 8 10

实际运维:

代码语言:javascript
运行
复制
1 2 4 5
2 3 4 5 6 7 8 2013562 10
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-08 15:30:41

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

但是看看这个循环:

代码语言:javascript
运行
复制
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++)的,这同样适用于打印它的位置。然后,可以按以下方式对向量进行排序:

代码语言:javascript
运行
复制
sort(arr.begin(), arr.end());

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

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56930078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档