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--;
        }
    }
}

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

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

肩上风骋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值