在分文件中使用qSort对QVecter排序

15 篇文章 0 订阅
11 篇文章 0 订阅
本文探讨了在使用自定义排序函数时遇到的问题,包括const关键字导致的排序错误和非静态成员函数不能作为qSort比较函数。解决方案是复制数据进行排序或者移除const修饰,以及在比较函数前添加static关键字。通过这两个调整,可以成功地在qSort中应用自定义的比较方式,实现所需排序效果。
摘要由CSDN通过智能技术生成
方法1:static bool compare(const QPointF &point_one, const QPointF &point_second)
{
    return point_one.x() < point_second.x();
}

方法2:bool compare(const QPointF &point_one, const QPointF &point_second)
{
    return point_one.x() < point_second.x();
}

问题一:在自己写的函数 使用自定义的排序方式时候,比如

//错误写法
QPointF myFunction(const QVector<QPointF>& points, const qreal xValue)
{  
    qSort(points.begin(), points.end(), compare);
}

原因是使用const关键字定义了常量,在后续的排序中并不能允许更改,但这种写法在qSort中进行了排序更改,所以报错。

解决方案

1.复制一份数据进行排序

QVector<QPointF> test_pnt(points);
qSort(test_pnt.begin(), test_pnt.end(), compare);

2.取消使用const关键字

问题2:在qSort中无法使用自定义的比较方式

解决方法:

需要在compare比较函数上使用static关键字进行修饰

qsort是C语言标准库提供的排序函数,可以对任意类型的数据进行排序。对链表使用qsort排序的一般步骤如下: 1. 定义一个比较函数,用于比较两个链表节点的值大小。 2. 将链表的节点的值复制到一个数组。 3. 使用qsort函数对数组进行排序。 4. 将排序后的数组的值赋回到链表节点。 下面是一个示例代码,用于对单向链表的整数进行排序: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点结构体 typedef struct node { int val; struct node *next; } Node; // 定义比较函数 int cmp(const void *a, const void *b) { int *pa = (int *)a; int *pb = (int *)b; return *pa - *pb; } // 对链表进行排序 void sortList(Node *head) { // 统计链表长度 int len = 0; Node *p = head; while (p) { len++; p = p->next; } // 将链表节点的值复制到数组 int *arr = (int *)malloc(len * sizeof(int)); p = head; for (int i = 0; i < len; i++) { arr[i] = p->val; p = p->next; } // 对数组进行排序 qsort(arr, len, sizeof(int), cmp); // 将排序后的值赋回到链表节点 p = head; for (int i = 0; i < len; i++) { p->val = arr[i]; p = p->next; } free(arr); } // 创建链表 Node *createList(int arr[], int n) { Node *head = NULL; for (int i = n - 1; i >= 0; i--) { Node *p = (Node *)malloc(sizeof(Node)); p->val = arr[i]; p->next = head; head = p; } return head; } // 打印链表 void printList(Node *head) { Node *p = head; while (p) { printf("%d ", p->val); p = p->next; } printf("\n"); } int main() { int arr[] = {5, 2, 8, 3, 6}; int n = sizeof(arr) / sizeof(int); Node *head = createList(arr, n); printf("原链表:"); printList(head); sortList(head); printf("排序后的链表:"); printList(head); return 0; } ``` 输出结果为: ``` 原链表:5 2 8 3 6 排序后的链表:2 3 5 6 8 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值