QT之QList的错误

这篇博客记录了在使用QT编程时遇到的QList错误,博主在解析字符串并将其赋值给结构体数组时遇到了数组越界问题。经过分析,发现是因为忘记初始化结构体并正确处理指针导致的。解决问题的方法是确保先初始化结构体,再将其放入数组中,并针对指针类型成员进行new操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   记录一下这次犯的错误~

    好气哦,看了一天时间bug。男朋友一下子帮我解决,有个程序员男朋友还挺好~

    相关问题描述:

                    resourse_label_str_list是个QStringList类型的,存放的是我解析出来的资源重组之后的数据。

     具体看:

    sysItemList.append("天伺馈J#综合测控基带D,S频段标准TT&C,4#火箭遥测基带D,S频段标准TT&C,3#数传基带D,S频段标准TT&C,2");

    for(int i = start;i <Item.length();i++){
        if(Item[i] == '#'){
            num[j]=i;
            resourse_label_str_list<<Item.mid(start,num[j]-start);
            start=num[j]+1;
         &n

<think>我们正在讨论Qt中的QList手动排序。用户希望了解如何手动对QList容器进行排序。在Qt中,QList是一个模板类,提供了动态数组的功能。虽然QList本身有排序方法(如qSort()或使用std::sort),但用户可能想了解手动排序(例如自己实现排序算法)来对QList进行排序。 手动排序意味着不使用Qt或标准库提供的排序函数,而是自己实现排序算法(如冒泡排序、插入排序等)来对QList中的元素进行排序。 步骤: 1. 遍历QList,根据排序算法比较相邻元素(或根据算法规则比较元素)。 2. 如果顺序不符合要求(比如升序时,前面的元素大于后面的元素),则交换这两个元素。 3. 重复这个过程直到整个列表有序。 注意:由于QList支持随机访问(通过下标),所以我们可以像操作数组一样操作它。 下面以冒泡排序为例,展示如何手动对QList进行升序排序。 冒泡排序的基本思想:重复地遍历要排序的列表,一次比较两个元素,如果它们的顺序错误就把它们交换过来。重复这个过程直到没有再需要交换的元素。 代码示例(使用C++): ```cpp #include <QList> #include <QDebug> // 手动冒泡排序 void manualBubbleSort(QList<int>& list) { int n = list.size(); for (int i = 0; i < n - 1; ++i) { for (int j = 0; j < n - i - 1; ++j) { if (list[j] > list[j+1]) { // 交换相邻的两个元素 list.swap(j, j+1); // 或者使用: // int temp = list[j]; // list[j] = list[j+1]; // list[j+1] = temp; } } } } int main() { QList<int> numbers = {5, 2, 9, 1, 5, 6}; manualBubbleSort(numbers); qDebug() << numbers; // 输出:[1, 2, 5, 5, 6, 9] return 0; } ``` 在上面的例子中,我们使用了QList的swap()函数来交换两个位置上的元素。当然也可以使用临时变量进行交换。 除了冒泡排序,我们也可以实现其他排序算法,比如插入排序: ```cpp void manualInsertionSort(QList<int>& list) { int n = list.size(); for (int i = 1; i < n; ++i) { int key = list[i]; int j = i - 1; // 将比key大的元素向后移动 while (j >= 0 && list[j] > key) { list[j+1] = list[j]; j--; } list[j+1] = key; } } ``` 注意:手动排序通常效率较低(尤其是冒泡排序),在真实项目中建议使用标准库的排序算法(如std::sort)或者Qt提供的排序函数(如qSort,但注意Qt5.15之后qSort被废弃,推荐使用std::sort)。手动排序主要用于学习目的。 引用说明:在Qt的文档中,QList提供了swap方法用于交换两个位置上的元素[^1]。同时,QList支持通过下标访问元素,这为手动排序提供了便利[^3]。 如果用户想要对自定义类型进行排序,那么需要确保自定义类型支持比较操作(比如重载了`<`运算符,或者在排序时提供比较函数)。 例如,对自定义结构体排序: ```cpp struct Person { QString name; int age; // 重载<运算符,用于比较 bool operator<(const Person& other) const { return age < other.age; } }; // 然后可以使用std::sort进行排序,但如果是手动排序,我们可以在比较时使用这个运算符或者自定义比较逻辑 // 在手动排序的比较部分,我们可以这样写: // if (list[j].age > list[j+1].age) { ... } // 根据年龄比较 ``` 总结:手动排序就是自己实现排序算法,通过遍历和交换元素来达到排序的目的。在QtQList中,我们可以像操作数组一样通过下标访问元素,并使用swap方法或临时变量交换元素。 相关问题: 1. 在Qt中,除了手动排序,还有哪些排序方法可以对QList进行排序? 2. 如何对存储自定义对象的QList进行排序? 3. 手动实现的排序算法(如冒泡排序)和标准库的排序算法在性能上有多大差异? 4. QtQList容器和QVector容器在排序上有什么区别?</think>### Qt QList 手动排序方法 在 Qt 中,虽然 `QList` 提供了 `std::sort()` 等内置排序方法,但手动排序在某些场景下仍有必要(如定制排序逻辑或学习目的)。以下是两种常用方法: #### 方法 1:冒泡排序(基础实现) ```cpp template<typename T> void bubbleSort(QList<T>& list) { for (int i = 0; i < list.size() - 1; ++i) { for (int j = 0; j < list.size() - i - 1; ++j) { // 自定义比较条件(此处为升序) if (list[j] > list[j + 1]) { list.swapItemsAt(j, j + 1); // 使用 Qt 内置交换方法[^1] } } } } // 使用示例 QList<int> numbers = {5, 2, 9, 1, 5}; bubbleSort(numbers); // 结果: {1, 2, 5, 5, 9} ``` #### 方法 2:自定义比较函数 + 手动排序 ```cpp template<typename T, typename Compare> void customSort(QList<T>& list, Compare comp) { for (int i = 0; i < list.size(); ++i) { for (int j = i + 1; j < list.size(); ++j) { // 使用传入的比较函数 if (comp(list[j], list[i])) { list.swapItemsAt(i, j); // 交换元素位置[^1] } } } } // 使用示例:降序排序 QList<int> values = {3, 1, 4, 1, 5}; customSort(values, [](int a, int b) { return a > b; // 降序比较 }); // 结果: {5, 4, 3, 1, 1} ``` #### 关键点说明 1. **交换元素**:优先使用 `swapItemsAt()` 而非临时变量,效率更高且避免拷贝开销[^1] 2. **自定义比较**:通过函数对象/lambda 实现灵活排序规则(如按对象属性排序) 3. **性能注意**:手动排序复杂度一般为 $O(n^2)$,大数据集建议用 `std::sort()` 4. **对象排序**:对自定义类排序时,需确保类支持比较操作(重载 `operator<` 等) > 对于自定义对象排序示例: > ```cpp > struct Person { > QString name; > int age; > bool operator<(const Person& other) const { > return age < other.age; // 按年龄升序 > } > }; > > QList<Person> people; > // ... 添加数据 > bubbleSort(people); // 自动使用重载的 < 运算符 > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值