我有一系列以下结构
typedef struct _my_data_
{
unsigned int id;
double latitude;
double longitude;
unsigned int content_len;
char* name_dyn;
char* descr_dyn;
} mydata;
Run Code Online (Sandbox Code Playgroud)
并希望按ID升序排序.我读过可以使用qsort函数对数组进行排序,但我不确定如何在排序结构时正确使用它.
任何帮助,将不胜感激.
Jon*_*ler 19
你需要一个结构比较器函数来匹配期望函数的原型qsort(),即:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
if (p1->id < p2->id)
return -1;
else if (p1->id > p2->id)
return +1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果您遇到更复杂的排序标准,这仍然是一个很好的基础,因为您可以使用相同的骨架添加辅助条件:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
if (p1->latitude < p2->latitude)
return -1;
else if (p1->latitude > p2->latitude)
return +1;
else if (p1->longitude < p2->longitude)
return -1;
else if (p1->longitude > p2->longitude)
return +1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
显然,这可以根据您的需要重复多种标准.如果需要调用函数(strcmp()?)来比较值,请调用一次,但将返回值分配给局部变量并使用两次:
int md_comparator(const void *v1, const void *v2)
{
const mydata *p1 = (mydata *)v1;
const mydata *p2 = (mydata *)v2;
int rc;
if (p1->latitude < p2->latitude)
return -1;
else if (p1->latitude > p2->latitude)
return +1;
else if (p1->longitude < p2->longitude)
return -1;
else if (p1->longitude > p2->longitude)
return +1;
else if ((rc = strcmp(p1->name_dyn, p2->name_dyn)) < 0)
return -1;
else if (rc > 0)
return +1;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此外,当数据成员是无符号整数时,此模板有效,并且在比较有符号整数时避免了溢出问题.请注意您有时可能会看到的捷径,即:
int md_comparator(const void *v1, const void *v2) /* BAD */
{ /* BAD */
const mydata *p1 = (mydata *)v1; /* BAD */
const mydata *p2 = (mydata *)v2; /* BAD */
return(p1->id - p2->id); /* BAD */
} /* BAD */
Run Code Online (Sandbox Code Playgroud)
如果id是无符号的则是坏的(两个无符号整数的差异从不是负的),如果整数是有符号的并且具有大的幅度和相反的符号,则会溢出.
| 归档时间: |
|
| 查看次数: |
11527 次 |
| 最近记录: |