在C+中排序时得到错误的输出+; 下面的C++代码使用Q排序:降序排列数组: #include<iostream> #include<cstdio> #include <stdlib.h> using namespace std; struct player { double data; int index; }; struct player A[] = {{0.690277,0}, {0.517857,1}, {0.780762,2}, {0.0416667,3}, {0.0416667,4}}; int compare (const void * a, const void * b) { return ( ((struct player*)b)->data - ((struct player*)a)->data ); } int main () { int n; qsort (A, 5, sizeof(struct player), compare); for (n=0; n<5; n++) printf ("data=%lf, index=%d\n", A[n].data, A[n].index); return 0; }

在C+中排序时得到错误的输出+; 下面的C++代码使用Q排序:降序排列数组: #include<iostream> #include<cstdio> #include <stdlib.h> using namespace std; struct player { double data; int index; }; struct player A[] = {{0.690277,0}, {0.517857,1}, {0.780762,2}, {0.0416667,3}, {0.0416667,4}}; int compare (const void * a, const void * b) { return ( ((struct player*)b)->data - ((struct player*)a)->data ); } int main () { int n; qsort (A, 5, sizeof(struct player), compare); for (n=0; n<5; n++) printf ("data=%lf, index=%d\n", A[n].data, A[n].index); return 0; },c++,sorting,qsort,C++,Sorting,Qsort,代码中有什么错误吗?在比较中,您将减去两个sub-1双精度并将其转换为整数,在大多数情况下,结果将为0。您应该比较它们并返回-1/1,而不是进行减法运算。请考虑使用此比较: int compare (const void * a, const void * b) { auto x = reinterpret_cast<const player*>(a); auto y = reinterpret_cast<const player*>(b); if

代码中有什么错误吗?

比较中,您将减去两个sub-1双精度并将其转换为整数,在大多数情况下,结果将为0。您应该比较它们并返回-1/1,而不是进行减法运算。

请考虑使用此比较:

int compare (const void * a, const void * b)
{
    auto x = reinterpret_cast<const player*>(a);
    auto y = reinterpret_cast<const player*>(b);
    if(x->data < y->data)
        return -1;
    if(x->data > y->data)
        return 1;
    return 0;
}
int比较(常量无效*a,常量无效*b)
{
自动x=重新解释铸件(a);
自动y=重新解释铸件(b);
如果(x->datadata)
返回-1;
如果(x->数据>y->数据)
返回1;
返回0;
}
也就是说,这种编码风格是古老的/不推荐的/糟糕的做法

考虑写类似的内容:

#include<iostream>
#include <algorithm>

struct player {
  double data;
  int index;

    bool operator < (const player& p) const
    {
        return data < p.data;
    }
};

auto A = std::vector<player>{
    {0.690277,0}, {0.517857,1},
    {0.780762,2}, {0.0416667,3}, {0.0416667,4}
};

int main ()
{
    std::sort(std::begin(A), std::end(A));
    for(const auto& x: A)
        std::cout << "data=" << x.data << ", "
            << "index=" << x.index << "\n";
}
#包括
#包括
结构播放器{
双重数据;
整数指数;
布尔运算符<(常数播放器和p)常数
{
返回数据STD:不是说代码< > QORD> <代码>有什么不对,但是你选择它的原因是什么?你的代码感觉非常“代码> C <代码>一般。在那里我有一些东西会更新为C++,就像这个问题被标记为SuCH。你能告诉我在比较函数里我会写什么吗?@ WeltSturura乌特纳皮斯蒂姆的回答。
#include<iostream>
#include <algorithm>

struct player {
  double data;
  int index;

    bool operator < (const player& p) const
    {
        return data < p.data;
    }
};

auto A = std::vector<player>{
    {0.690277,0}, {0.517857,1},
    {0.780762,2}, {0.0416667,3}, {0.0416667,4}
};

int main ()
{
    std::sort(std::begin(A), std::end(A));
    for(const auto& x: A)
        std::cout << "data=" << x.data << ", "
            << "index=" << x.index << "\n";
}