栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[Qt]容器类、迭代器、foreach关键字

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[Qt]容器类、迭代器、foreach关键字

容器类 顺序容器类 QLlist

QList是最常用的容器类,是以数组列表(array-list)的形式实现的,QList可以以下标索引的方式对数据项进行访问,常用函数:

函数作用
insert(value)指定位置插入
replace(value)替换
removeAt(value)删除指定对象
move()移动
swap()交换
append(value)在末尾添加
prepend(value)从头部插入
removeFirst()移除第一个对象
removeLast()移除最后一个对象
isEmpty()是否为空,为空则为true
size()返回数据项的个数
at(i)获取第i个值

例如:

QList list;
list<<"one"<<"two"<<"three";
QString str1=list[1]; //"two"
QString str0=list.at(0); //"one"
QLinkedList

QLinkedList是一个链式列表,基于迭代器访问数据项,并且插入和删除数据项的操作时间相同,不提供基于下标索引的数据项访问,其余函数和QList基本相同。

QVector

QVector是一个提供动态数组的功能,可以以下标索引访问数据,函数接口与QList基本相同,性能比QList更高,因为QVector的数据项是连续存储的。

QStack

QStack是提供类似于堆栈的后入先出(LIFO)操作的容器类,常用函数:

函数作用
push(value)推入数据
pop()弹出最上方的数据
QQueue

QQueue是提供类似于队列的先入先出(FIFO)操作的容器类,常用函数:

函数作用
enqueue(value)入队列
dequeue()出队列w
关联容器类 QSet

QSet是基于散列表的集合模板类,存储数据的顺序是不定的,查找值的速度很快,内部是由QHash实现的,常用函数:

函数作用
contains(value)查找一个值是否包含于这个集合,查找成功为true
QMap

QMap提供一个字典(关联数组)的容器类,一个键映射到一个值,并且也可用下标索引查询和对数据赋值。QMap存储数据是按照键的顺序存储的,如果不在乎存储顺序,则QHash会更快。常用函数:

函数作用
insert(key,value)插入一对键值
remove(key)移除一个键值对
values(key,[value])查找一个值,找到了就返回这个值,没找到,可以设置一个value,来返回这个value
insertMulti()一般QMap不允许多值映射,但是使用这个函数可以添加键值对

例如:

//对map进行赋值,赋值是按顺序存储的
QMapmap;
map["one"]=1;
map["two"]=2;
map["three"]=3;
QMultiMap

QMultiMap是QMap的子类,用于处理多值映射的便利类,就是一个键可以对应多个值,QMultiMap不提供“[]”操作符,常用函数:

函数作用
insert(key,value)插入键值对
replace(key,value)替换,

如果已经有一个项目有了键值,那么这个项目的值会被替换成value。

如果有多个带有key key的项目,最近插入的项目的值将被替换为value。

value(key)访问最新插入的键的单个值
values(key)获取键的所有值,返回值是QList类型
QHash

QHash是基于散列表来实现字典功能的模板类,QHash存储的键值对待具有非常快的查找速度。

QHash与QMap的功能和用法相似,区别如下:

  • QHash比QMap的查找速度更快
  • 在QMap上遍历时,数据项必须是按照键的排序的,而QHash的数据项是任意的
  • QMap的键必须提供"<"运算符,QHash的键必须提供"=="运算符和一个名词为qHash()的全局散列函数
迭代器 Java类型迭代器

 Java类型迭代器不是指向数据项,而是在数据项之间,如图:

 常用函数:

 例如:

    //JAVA类型迭代器
        //只读
    QListIterator i(s);
            //for循环
    for (; i.hasNext();)
    {
        qDebug() << i.next();
    }
    i.toFront();
            //while
    while (i.hasNext())
    {
        qDebug() << i.next();
    }
        //读写
    QMutableListIterator o(s);
    o.toFront();
    for (; o.hasNext();)
    {
        o.next();     //这里的o.next要和setvalue交换位置,因为,JAVA迭代器是从前面开始的,就是先next跳过这一项并返回跳过的这一项的值,用以下面的操作
        o.setValue("帅");
    }
    o.toFront();
    while (o.hasNext())
    {
        qDebug() << o.next();
    }

 注意:

Java类型的迭代器是指向数据项之间的,每次使用next()函数时,迭代器是先跳到下一对数据项之间,再返回跳过的数据项的值,供于下面的操作的。如图:

STL类型迭代器

STL类型的迭代器是数组指针,并且是直接指向数据项的与Java的不同,所以“++”运算符可以使迭代器指向下一个数据项,“*”运算符可以返回数据项的内容。

注意:在定义只读迭代器和读写迭代器时,他们使用的是不同的关键字,此外还可以使用const_reverse_iterator和reverse_iterator定义相应的反向迭代器。

常用函数:

函数作用
begin()[用于读写迭代器]使迭代器指向容器的第一个数据项
end()[用于读写迭代器]使迭代器指向一个虚拟的表示结尾的数据项
constBegin()[用于只读迭代器]表示起始位置
constEnd()[用于只读迭代器]表示结束位置
rbegin()[用于反向读写/只读迭代器]表示起始位置
rend()[用于反向读写/只读迭代器]表示结束位置

例如:

    //STL类型迭代器
        //只读
    QList::const_iterator m;
    for (m = s.constBegin(); m != s.constEnd(); m++)
    {
        qDebug() << *m;
    }
        //读写
    QList::iterator n;
    for (n = s.begin(); n != s.end(); n++)
    {
        *n = "牛";
        qDebug() << *n;
    }
foreach关键字

foreach是头文件中定义的一个宏,作用是遍历容器中所有的项。使用foreach的语法是:

foreach(variable , container)

variable和container里的类型是一样的

例如:

    //foreach关键字
    QList s;
    //写法一
    QString str;
    foreach(str,s)        
    {
        qDebug() << str;
    }
    //写法二
    foreach(const string &str,s)
    {
        qDebug() << str;
    }

注意:foreach是创建了容器的副本,所以不能修改原来容器变量的数据项,写法二里必须是常量定义的类型,const string &str

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/869249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号