写点什么

Qt | QList 的 removeAt、takeAt 的区别

作者:YOLO.
  • 2022-10-20
    河北
  • 本文字数:849 字

    阅读完需:约 1 分钟

Qt | QList的removeAt、takeAt的区别

前言

在使用 QList 时,需要进行删除某一项的操作,发现 QList 提供了两个移除的方法,一个是 removeAt(),一个是 takeAt()。我创建的是一个存放指针变量的 QList,需要实现两个功能,一个是移除并销毁 item,一个是移除但是不销毁 item。在选择这两个方法时就产生了疑问。于是查阅了官方帮助和网上资料做对比,总结一下这两个方法的区别。

官方解释

  • removeAt(i): 删除索引位置 i 的项。i 必须是列表中有效的索引位置(即 0 <= i < size())。

  • takeAt(i): 移除位于索引位置 i 的项并返回它。i 必须是列表中有效的索引位置(即 0 <= I < size())。如果不使用返回值,removeAt()更合适。


这里说明两个方法都是移除 QList 某一项的方法,不同的地方在于,removeAt()没有返回值,而 takeAt()会返回移除的项的值。

简单使用

用一个简单的例子说明一下这两个方法的区别:


QList<int> list;list << 1 << 2 << 3;
//removeAtlist.removeAt(0);qDebug() << list; //结果:2,3
//takeAtint i = list.takeAt(0)qDebug() << i; //结果:1qDebug() << list; //结果:2,3
复制代码


这两个方法都移除了列表的第一项,不同的是,takeAt 方法可以返回移除项的值。

特殊使用

当 QList 中的类型为指针类型时(即每一项存入的都是一个动态创建的内存的指针),移除某一项时的操作:


如果 QList 为指向 T 类型项的指针数组,那么 QList 将项直接存储在指针数组中。


QList 只保存你传入的基本指针,而不去或者不能知道这些指针是被怎么创建的,在何处创建的。所以在移除一个指针项时,只是将这个指针从列表中移出,而指针所指向的内存并没有被释放。如果需要释放,那么需要自己手动进行释放。


QList<MyClass *> list;for(int i=0; i<3; i++){    MyClass *myclass = new MyClass(this);    list.append(myclass);}
//removeAtremoveAt(0); // 移除第0项存放的指针地址, 指针指向的内存没有被释放
//takeAtMyClass * item = takeAt(0); //移除第0项,并释放该指针指向的内存delete item;item = nullptr;
复制代码


这两个方法都不能实现移除但是不销毁 item,我们需要重新创建一个相同的 item 进行保存。

发布于: 刚刚阅读数: 3
用户头像

YOLO.

关注

还未添加个人签名 2022-05-06 加入

还未添加个人简介

评论

发布
暂无评论
Qt | QList的removeAt、takeAt的区别_qt_YOLO._InfoQ写作社区