qt中QList使用removeAt()删除元素

提要

QList删除元素的时候需要特别注意一点,将元素删除后链表中元素的排列。删除一个元素后,后面的元素会补到被删元素的位置,这样在for循环中若删除元素后继续执行下标++,则会少遍历元素。下面看一个示例。

示例

下面是出错的代码,删除元素后执行了下标++。

//参数大概说明,仅说明,不涉及定义
QListReso    m_listResolution;//保存每块屏的分辨率
stuBigScreen m_stuBigScrInfo;//保存大屏列表的信息
//每块屏的分辨率
typedef struct resolutions{
    int     row;//行数
    int     col;//列数
    int     width;//分辨率的宽
    int     height;//分辨率的高
}ST_RESOLU;

typedef QList<ST_RESOLU> QListReso;
typedef ST_RESOLU  stuReso;

//大屏列表信息
typedef struct bigScreInfo{
    int         bigScreRow;//大屏的行数
    int         bigScreCol;//大屏的列数
    QString     strName;//大屏名称
    QListReso   resoluList;//大屏列表中每块屏的分辨率
}ST_BIGSCR_INFO;

typedef ST_BIGSCR_INFO stuBigScreen;
//以上仅为变量类型说明,提供以便理解下面代码


void largeScreenListWidget::deleteDontExist()
{
    for(int i = 0; i < m_listResolution.size(); ++i){
        if(m_listResolution[i].row >= m_stuBigScrInfo.bigScreRow ||
        m_listResolution[i].col >= m_stuBigScrInfo.bigScreCol){
            m_listResolution.removeAt(i);
        }
    }
}

使用下标删除部分元素后,发现链表中还有部分满足删除条件的元素没有被删除,原因是在被删除元素后面的元素,会补上前面被删除元素的位置。此时再执行下标++,会跳过一个元素,故而当删除元素后,不能执行下标++,而要再在原来的被删除的元素的位置上再去判断一下是否满足删除条件。
正确的代码如下:

void largeScreenListWidget::deleteDontExist()
{
    for(int i = 0; i < m_listResolution.size(); ++i){
        if(m_listResolution[i].row >= m_stuBigScrInfo.bigScreRow ||
        m_listResolution[i].col >= m_stuBigScrInfo.bigScreCol){
            m_listResolution.removeAt(i);
            i--;
        }
    }
}

相比前面的代码,此段代码的实现中多了下标–,为了将删除元素后紧跟着补到被删除元素的位置上的元素也进行判断,这样所有的元素都会判断看是否满足删除条件。

### 如何在 QtQList删除指定元素Qt 的 `QList` 容器中,可以通过多种方法来删除指定的元素。以下是几种常见的实现方式: #### 方法一:使用 `removeAll()` 删除所有匹配的元素 如果需要从 `QList` 中移除所有等于某个特定值的元素,可以调用 `removeAll()` 函数[^1]。 ```cpp #include <QList> #include <QDebug> int main() { QList<int> list; list << 1 << 2 << 3 << 2 << 4; qDebug() << "Before removal:" << list; list.removeAll(2); // 移除所有的 '2' qDebug() << "After removal:" << list; return 0; } ``` 此代码片段展示了如何通过 `removeAll()` 来删除所有值为 `2` 的元素。 --- #### 方法二:使用 `removeOne()` 删除首个匹配的元素 当只需要删除首次出现的特定值时,可使用 `removeOne()` 函数。 ```cpp #include <QList> #include <QDebug> int main() { QList<int> list; list << 1 << 2 << 3 << 2 << 4; qDebug() << "Before removal:" << list; bool success = list.removeOne(2); // 移除第一个 '2' if (success) { qDebug() << "Element removed successfully."; } qDebug() << "After removal:" << list; return 0; } ``` 上述代码演示了如何利用 `removeOne()` 删除第一次出现的目标值。 --- #### 方法三:使用 `erase()` 和迭代器手动删除 对于更复杂的场景,比如条件性删除或者批量处理多个元素,可以结合 STL 风格的迭代器和 `erase()` 实现[^2]。 ```cpp #include <QList> #include <QDebug> int main() { QList<int> list; list << 1 << 2 << 3 << 2 << 4; qDebug() << "Before removal:" << list; auto it = list.begin(); while (it != list.end()) { if (*it == 2) { // 如果当前元素满足条件,则删除 it = list.erase(it); } else { ++it; // 否则移动到下一个元素 } } qDebug() << "After removal:" << list; return 0; } ``` 这种方法提供了更大的灵活性,允许根据任意逻辑筛选并删除目标元素。 --- #### 方法四:使用 `removeAt()` 删除指定索引处的元素 如果已知要删除元素的具体位置,可以直接调用 `removeAt(index)` 函数[^3]。 ```cpp #include <QList> #include <QDebug> int main() { QList<int> list; list << 1 << 2 << 3 << 4; qDebug() << "Before removal:" << list; int indexToRemove = 1; // 假设我们要删除第二个元素 if (indexToRemove >= 0 && indexToRemove < list.size()) { list.removeAt(indexToRemove); } qDebug() << "After removal:" << list; return 0; } ``` 需要注意的是,在循环过程中动态修改列表长度可能导致意外行为,因此应小心管理索引变量。 --- ### 总结 以上介绍了四种不同的策略用于从 `QList` 中删除指定项: - **`removeAll(value)`**: 批量清除所有符合条件的项目; - **`removeOne(value)`**: 单次定位并剔除首条记录; - **STL 迭代器配合 `erase(iterator)`**: 动态控制哪些数据应当保留或丢弃; - **`removeAt(index)`**: 显式依据下标完成单步操作。 每种技术都有其适用场合,请根据实际需求选取最合适的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肩上风骋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值