gpt4 book ai didi

c++ - qsort 不适用于我的 impl 中的浮点类型。怎么了?

转载 作者:行者123 更新时间:2023-11-28 04:03:18 25 4
gpt4 key购买 nike

我不知道为什么代码不适用于浮点类型,我的意思是 qsort 算法。我尝试了不同的方法来排序它,但没有成功。在 int 类型的情况下,代码工作正常但不适用于 floating 类型,这让我感到困惑。任何人都知道这是什么问题?

感谢 tpps。

标题:

template <class T>
class arraysort
{
public:

arraysort(int);
~arraysort();
//int compare (const void *a,const void *b);
T& operator[] (int index);
void quicksort(T a, T b);
void printout();

private:
T *ptr;
int size;
const void *a;
const void *b;
static T compare (const void * a, const void * b);
};

C++

#include "arraysort.h"
#include <stdlib.h>

template <typename T>
arraysort<T>::arraysort(int s)
{
size = s;
ptr = new T[size];
}

template <typename T>
arraysort<T>::~arraysort()
{
delete [] ptr;
}

template <typename T>
T& arraysort<T>::operator[](int index)
{
return ptr[index];
}

template <typename T>
T arraysort<T>:: compare (const void * a, const void * b)
{
T fa = * (const T * ) a;
T fb = * (const T * ) b;
return (fb - fa);
}

template <typename T>
void arraysort<T>::quicksort (T a, T b)
{
qsort(ptr, size, sizeof(T), (int( * )(const void * ,const void * )) compare);
}

template <typename T>
void arraysort<T>::printout()
{
for(int i = 0; i < size; i++)
std::cout<< ptr[i] <<" ";
std::cout<<std::endl;
}

最佳答案

qsort 调用的比较函数应该返回一个 int,但是当您的模板使用 float 时,该函数返回一个 float 。这会调用 undefined behavior .

更改 compare 函数以始终返回 int 并执行显式比较以确定哪个更大。

template <typename T>
int arraysort<T>:: compare (const void * a, const void * b)
{
T fa = * (const T * ) a;
T fb = * (const T * ) b;

if (fa > fb) {
return -1;
} else if (fa < fb) {
return 1;
} else {
return 0;
}
}

请注意,这不处理 NaN 值。您需要弄清楚如何分别处理它们。

关于c++ - qsort 不适用于我的 impl 中的浮点类型。怎么了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59164344/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com