qsort 不适用于我的 impl 中的浮点类型。怎么了?
qsort doesn't work for float types in my impl. what is wrong?
我不知道为什么代码不适用于浮点类型,我的意思是 qsort 算法。我尝试了不同的方法来排序它,但没有成功。在 int 类型的情况下,代码工作正常但不适用于 floating 类型,这让我感到困惑。有人知道是什么问题吗?
感谢 tpps。
header:
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
调用的比较函数预期为 return 和 int
,但是当您的模板使用 float
函数时 return a float
。这会调用 undefined behavior.
将 compare
函数更改为始终 return 和 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 值。您需要弄清楚如何分别处理它们。
我不知道为什么代码不适用于浮点类型,我的意思是 qsort 算法。我尝试了不同的方法来排序它,但没有成功。在 int 类型的情况下,代码工作正常但不适用于 floating 类型,这让我感到困惑。有人知道是什么问题吗?
感谢 tpps。
header:
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
调用的比较函数预期为 return 和 int
,但是当您的模板使用 float
函数时 return a float
。这会调用 undefined behavior.
将 compare
函数更改为始终 return 和 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 值。您需要弄清楚如何分别处理它们。