Qlist的用法

2023-05-16

  QList是一种表示链表的模板类。
QList是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作。
QList、QLinkedList和QVector提供的操作极其相似:
*对大多数操作来说,我们用QList就可以了。其API是基于索引(index)的,因此用起来比QLinkedList更方便(QLinkedList的API是基于迭代器的)。QList比QVector更快,这是由它们在内存中的存储方式决定的。
* 需要使用QLinkedList的地方:
* 需要使用QVector的地方:元素的储存位置彼此相邻。
QList表示为一组指向被存储元素的数组。(例外,如果T本身就是指针类型,或者是size不大于指针类型的基本类型,或者是Qt的共享类,那么QList会直接在指针数组中存储这些元素。)元素个数小于1000的QList能够很快地实现在链表中间插入操作,以及快速的查找操作。此外,由于QList在链表两端都预先分配了内存,因此实现prepend()和append()操作都很快。
注意:对于size比指针大的共享类,使用QVector会更好。
以下是两个分别存储int型数据和QDate类型数据的链表:
QList intList;
QList dateList;
对于字符串链表,Qt提供了QStringList类。它继承自QList,但还提供了一些其他便于使用字符串的函数:QStringList::join()、QStringList::find()、QStringList::split()。
QList以链表形式存储一组元素。默认为空链表,我们可以使用<<操作符添加元素:
QList list;
list << "one" << "two" << "three"; // list:["one", "two", "three"]
QList提供了一系列添加、移动、删除元素的操作:insert(), replace(), removeAt(),swap()
。此外,它还提供了便于操作的函数:append(), prepend(), removeFirst(),removeLast()。
QList与C++中数组的索引方式一样,都是从0开始的。我们可以使用[]操作符来访问位于索引值处的元素。对于非const链表,操作符[]返回的是该元素的引用,并且返回值可以用途左操作数。
if ( list[0] == "Bob" )
    list[0] = "Robert";
由于QList是以指针数组的形式实现的,该操作能够很快地实现(时间复杂度为常数)。对于只读访问,我们可以用at()函数实现访问:
for ( int i=0; i!=list.size(); ++i )
{
    if ( list.at(i) == "Jane")
    { cout << "FoundJane at position:" << i<< endl;}
}
at()操作比操作符[]更快,因为它不需要深度复制(deep copy)。
QList的一个常用操作是,从链表中取出一个元素(元素不再在链表之中),并对该元素进行操作。
QList提供了以下操作来实现此功能:takeAt()、takeFirst()、takeLast()。以下是一个示例:
QList list;
...
while ( !list.isEmpty() )
    deletalist.takeFirst();
由于QList在链表两端都预先分配了缓存以应对链表两端的快速添加操作,这样就使得在QList的
两端插入或删除元素变得非常地快。
如果需要找出某个值在链表中出现的位置,我们可以使用indexOf()、lastIndexOf()函数来实现。
前者进行前向查找,而后者则进行反向查找。两者都会在找到匹配元素后返回该元素的索引值。若
没有找到匹配元素,则返回-1。例如:
int i = indexOf("Jane");
if ( i!=-1 )
    cout << "Firstoccurance of Jane is at position" << i << endl;
如果仅仅是想判断链表中是否包含某一值,我们可以使用函数contains()。如果希望知道某一值在
链表中的出现次数,使用count()函数。如果要替换掉链表中所有值与某一值相同的元素,使用
replace()。
QList的值必须是可数的类型。这包含了我们常用的大多数类型。但是,如果我们存储QWidget类型
的话,编译器也不会通知我们出错了。但是,我们应该使用QWidget *,而不是QWidget。此外,一
些函数还作出了其它限制,比如:indexOf()和lastIndexOf()操作要求值的类型能进行“==”操作。
与其他容器一样,QList也提供了Java形式的迭代器(QListIterator和QMutableListIterator)。
以及STL形式的迭代器(QList::const_iterator和QList::iterator)。实际上,由于可通过索引值
来访问元素,我们很少使用这些迭代器。使用索引值访问元素的速度与迭代器相差无几。
为了提高效率,QList的成员函数在使用前并不会验证其参数是否有效。除isEmpty()函数外,其它
成员函数都会假定该容器为非空容器;使用索引值(index)进行操作的成员函数都会假定其索引值参
数是在有效范围内的。这就意味着,QList在有些时候会出错。如果在编译时,我们定义了QT_NO_DEBUG
,编译过程中就不会检测这些错误。如果没有定义QT_NO_DEBUG,我们可以利用Q_ASSERT()或者
Q_ASSERT_X()加上一些合理的信息来实现错误检测。
我们可以在调用其他函数之前先调用isEmpty()函数判断链表是否为空,以避免对空链表进行错
误操作。而对于以索引值index为参数的成员函数,我们还需要判断该索引值是否位于有效范围
内。 
QList list;
    list<<1<<2<<3<<4<<5<<6<<7<<8;
 
QList的插入
    void append(constT&value)             在QList尾部插入value
    void append(constTQList&value)       在QList尾部插入QList&value
    void insert ( int i,const T & value )       在QList其中某个位置插入value,假如没 声明i ,i默认size()及在最后插入value
    iterator insert (iterator before, const T & value )     在迭代器的前个位置插入value并返回当前迭代器的位置
 
QList的删除
      voidclear ()   删除QList的内容
      iterator erase ( iterator pos )    删除迭代器位置的值,返回下个迭代器位置
      iterator erase ( iterator begin, iterator end )  删除一块的迭代器begin和end的值,返回下一个迭代器
            QList::iterator i;
            i=list.begin();
            i++;
            i=list.erase(i,i+2);
              for(i=list.begin();i!=list.end();i++)
            {
                qDebug()<<(*i);
            }
   
      intremoveAll ( const T & value )     删除返回删除个数    
  QList list;
  list << "sun" << "cloud"<< "sun" << "rain";
  list.removeAll("sun");
  // list: ["cloud", "rain"]
      voidremoveAt ( int i )       删除某个值
      voidremoveFirst ()         删除最前一个值
      voidremoveLast ()         删除最后一个值
      boolremoveOne ( const T & value )     删除value中的一个
 
  QList list;
  list << "sun" << "cloud"<< "sun" << "rain";
  list.removeOne("sun");
  // list: ["cloud", ,"sun", "rain"]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qlist的用法 的相关文章

随机推荐

  • esp32c3 nuttx 移植 micropython 尝试

    源码来自 https github com apache incubator nuttx apps pull 840 和 https github com apache incubator nuttx apps tree 787ac9060
  • 曼孚技术分享丨浅析自动驾驶车辆检测技术

    提到自动驾驶 xff0c 有人不禁会好奇 xff0c 自动驾驶系统如何感知周围环境并做出 人类 的决定 自动驾驶技术的主要模块共三大类 xff0c 即感知 规划和控制 它们之间相互协作 xff0c 共同为车辆的安全性与舒适性保驾护航 简单来
  • ros2话题的发布者和订阅者——ubuntu20.04+自定义话题接口类型

    文章目录 话题的发布者话题的订阅者自定义话题的接口类型将自定义的话题引入到程序中 话题的发布者 导入消息类型 xff0c ros自带的消息类型在std msgs msg 下面 xff0c 有string等类型定义一个类 xff0c 里面声明
  • 红外遥控器与红外接收器调试问题分析

    红外误码问题分析 目前开发的产品是带Qt界面的 xff0c 所以作为一款可视化控制产品 xff0c 遥控器是必不可少的 xff0c 前段时间正好调试了遥控器与红外接收模块 xff0c 现总结下遇到的红外误码问题分析解决过程 分析思路分为两个
  • Ubuntu18.04下安装Cuda8及以上版本

    Ubuntu18 04下安装Cuda8及以上版本 cuda8已经不支持GCC5及以上版本的安装 xff0c 而ubuntu18自带的gcc版本为7 5 xff0c 所以安装时会报错Error unsupported compiler 7 5
  • ubuntu安装cmake的三种方法(超方便!)

    Ubuntu安装cmake的三种方法 xff08 超方便 xff01 xff09 第一种方法 xff08 不推荐 xff09 直接使用apt安装 xff0c 但是安装的版本很老 xff0c 不推荐这种方法 span class token
  • ubuntu中eigen库的安装(所有历史版本均可安装)

    ubuntu中eigen库的安装 所有历史版本均可安装 xff09 目前官网以及一些文章给出的wget网址出现错误 xff0c 下载不了 The requested repository either does not exist or y
  • Ubuntu安装opencv及问题解决(所有版本通用)

    Ubuntu安装opencv及问题解决 xff08 所有版本通用 xff09 安装编译 获取源码 span class token function git span clone https github com opencv opencv
  • 华为云端服务器使用ModelArts跑MindSpore框架Yolov5

    华为云端服务器使用Modlearts跑MindSpore框架Yolov5 环境准备 云平台登录 xff0c 用于购买服务器https uconsole xckpjs com 我这里用的是昇腾Ascend 910点击ModelArts打开控制
  • git 环境搭建以及常用指令笔记

    目录 1 Git 环境搭建1 1 Git 配置正常显示中文文件名 2 Git 常用指令2 1 Git 生成差异文件补丁包2 2 Git 移除未纳入跟踪的文件2 3 Git 选择性合并分支 1 Git 环境搭建 1 1 Git 配置正常显示中
  • ROS命令 catkin_init_workspace 分析

    ros版本 xff1a Ubuntu18 04 Melodic 之前在调试ros工作空间环境变量的问题的时候修改了工作空间src文件夹下的CMakeLists txt以进行打印消息分析出错的原因 在我新建另外一个工作空间 xff0c 执行c
  • BundleFusion复现手册——Win10+VS2013+Cuda8.0+KinectV2实时重建

    文章目录 一 摘要二 操作环境三 工程环境配置3 1 装VS2013和CUDA8 03 2 DirectX SDK 安装3 3 Kinect SDK 2 0 四 VS2013代码生成 xff08 以离线数据为例 xff09 4 1 依赖配置
  • C++基础入门

    C 43 43 基础入门 C 43 43 初识HelloWord变量 常量和关键字 数据类型整型实型 xff08 浮点型 xff09 字符串 C 43 43 初识 HelloWord 打开Visual Studio xff0c 创建新项目
  • 二(两)视图多视图点云配准

    二视图多视图点云配准综述 多视图视图点云配准多视图点云粗配准基于生成树的粗配准基于形状生成的多视图粗配准算法 多视图点云精配准 点云配准 xff08 Point Cloud Registration xff09 是将两个或多个点云数据集对齐
  • 点云传统滤波算法

    点云滤波 分割功能滤波直通滤波条件滤波提取索引滤波 下采样类滤波体素滤波均匀采样滤波 去除噪声点类滤波统计滤波半径滤波高斯滤波双边滤波随机采样一致滤波投影滤波 本文介绍了各种滤波算法的原理以及给出了相关实现方法 分割功能滤波 分割功能滤波是
  • K-d树和八叉树

    K d树 xff1a 解决KNN近邻问题查找效率 对于一个k维的超平面 xff0c 在KD树每一层的构建中都选择一个维度来进行划分 xff0c 将k维的数据空间分为两部分 xff0c 并使其尽量平衡 然后如此递归下去 也就是说假如我们要储存
  • C++突击面试

    目录 1 编译内存相关 1 1 C 43 43 程序编译过程 1 2 C 43 43 内存管理 1 3 栈和堆的区别 1 4 变量的区别 1 5 全局变量定义在头文件中有什么问题 xff1f 1 6 内存对齐 1 7 什么是内存泄露 1 8
  • 自动驾驶 规划综述

    Motion Planning What is motion planning 规划的本质是 xff1a 搜索问题 好 的规划就是一个目标函数 xff1a 求最优解 Motion Planning的三个领域 Robotic Fields 生
  • 数值最优化

    书 xff1a Numerical Optimization 文档 xff1a 安全验证 知乎 知乎 xff0c 中文互联网高质量的问答社区和创作者聚集的原创内容平台 xff0c 于 2011 年 1 月正式上线 xff0c 以 让人们更好
  • Qlist的用法

    QList是一种表示链表的模板类 QList是Qt的一种泛型容器类 它以链表方式存储一组值 xff0c 并能对这组数据进行快速索引 xff0c 还提供了快速插入和删除等操作 QList QLinkedList和QVector提供的操作极其相