QMutableListIterator详解

目录

是什么:

1. 从列表中删除特定元素

2. 替换特定元素


是什么:

Qt中,QMutableListIterator 是一个用于迭代和修改 QList(动态数组) 的类。QMutableListIterator 继承自 QListIterator,并添加了修改和删除元素的功能,这使得你可以在迭代过程中修改列表的内容。

以下是如何使用 QMutableListIterator 的基本示例:

#include <QList>
#include <QMutableListIterator>
#include <QDebug>

int main() {
    QList<int> numbers;
    numbers << 1 << 2 << 3 << 4 << 5;

    // 创建一个 QMutableListIterator 来迭代和修改列表
    QMutableListIterator<int> it(numbers);

    while (it.hasNext()) {
        int value = it.next();

        if (value % 2 == 0) {
            // 如果元素是偶数,就修改它为其平方值
            it.setValue(value * value);
        } else {
            // 如果元素是奇数,就删除它
            it.remove();
        }
    }

    // 输出修改后的列表
    qDebug() << "Modified List:";
    for (int num : numbers) {
        qDebug() << n
代码概述 该代码试图使用 `QListIterator` 的 `toFront()` 方法重置迭代器位置,但由于**迭代器绑定的列表在迭代期间发生了改变**,导致 `toFront()` 未能如预期那样遍历到新修改后的数据。 --- 代码解析 1. **初始化空列表并创建迭代器** ```cpp QList<int> list; QListIterator<int> i(list); ``` - 这里 `list` 是一个空列表,迭代器 `i` 绑定的是空列表。 2. **首次遍历(无输出)** ```cpp while (i.hasNext()) { qDebug()<<i.next(); } ``` - 因为 `list` 是空的,所以没有输出。 3. **向列表中添加元素** ```cpp for (int var = 0; var < 20; ++var) { list << var; } ``` - 列表此时包含 0 到 19 的整数。 4. **使用 `QMutableListIterator` 删除奇数元素** ```cpp QMutableListIterator<int> mi(list); while (mi.hasNext()) { if (mi.next() % 2 != 0) { mi.remove(); } } ``` - 删除后列表只包含偶数:0, 2, 4, ..., 18。 5. **调用 `toFront()` 并再次遍历** ```cpp i.toFront(); while (i.hasNext()) { qDebug()<<i.next(); } ``` - **问题所在**:这里的 `i` 是最初绑定空列表的迭代器,虽然调用了 `toFront()`,但它已经失效,因为底层数据已经被修改。 - Qt 的迭代器不是实时跟踪容器变化的“智能迭代器”,一旦容器结构发生变化(如添加或删除元素),原有迭代器就失效了。 --- 解决方案 要在修改后重新遍历列表,应该在修改之后**重新绑定迭代器**: ```cpp QListIterator<int> i(list); // 重新创建迭代器 i.toFront(); // 此时有效 ``` 或者直接省略 `toFront()`(因为默认从头开始): ```cpp QListIterator<int> i(list); while (i.hasNext()) { qDebug() << i.next(); } ``` --- 知识点(列出该代码中遇到的知识点) - `QListIterator`:Qt 容器的只读迭代器,用于顺序访问 QList 中的元素。 - `toFront()`:将迭代器移动到容器的起始位置,但如果容器已修改则可能失效。 - 迭代器失效:当容器结构发生修改(如增删元素)后,原有迭代器可能无法正常工作,需重新创建。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值