QVariantList和QVariantMap的遍历


原文链接:https://blog.csdn.net/Li6682438/article/details/122731930

QVariantList 的遍历

    QVariantList getRes=map_arr["content"].toList(); //将map的"content"转为list
    QString editStr1,esitStr2;
    editStr="";
    for(auto iter:getRes){                           //字符串拼接并显示到edittext上
       editStr1=iter.toMap()["name"].toString();
       editStr+=" "+editStr1+"         ";
       esitStr2=iter.toMap()["version"].toString();
       editStr+=esitStr2+"\n";
    }

QVariantList不会给数据自动排序,想取数据时通过遍历去取也可以通过方法 .at() 来获取第几个数据

QVariantMap遍历


QVariantMap QVMap;
QVMap.insert("aaa", 1);
QVMap.insert("bbb", 2);
QVMap.insert("ccc", 3);
QVMap.insert("ddd", 4);
QVariantMap::iterator iter;
for(iter=QVMap.begin(); iter!=QVMap.end(); iter++){
    qInfo()<<"aaaa"<<it.key()<<it.value().toInt();
}

注意,QVariantMap会给数据自动排序(你可以改变QVariantMap的排序顺序),所以QVariantMap不适合直接用 .at 直接获取数据,除非本来就是要排序好的数据。

QVariantMap可以直接通过Key来获取对应的Value,注意QVariantMap的Key为String,Value可以是任意值,例如 你想获取上面QVMap里"ccc"所对应的value值时,可以直接用 QVMap[“ccc”].value.toInt() 获取。


Qt 的容器类提供了两种风格的遍历器:Java 风格和 STL 风格。这两种风格的遍历器在通过非 const 函数对集合进行修改时都是不可用的。

Java 风格的遍历器
Java 风格的遍历器是在 Qt4 首先引入的,是 Qt 应用程序首先推荐使用的形式。这种风格比起 STL 风格的遍历器更方便。方便的代价就是不如后者高效。它们的 API 非常类似于 Java 的遍历器类,故名。


Qt容器类及其遍历(Java风格和STL风格迭代器)


原文链接:https://blog.csdn.net/zyx_0604/article/details/70148363

1、Qt提供了一组通用的基于模板的容器类。Qt的容器类对比C++的标准准模板库中的容器类,更轻量、更安全、更容易使用;此外,Qt的容器类还在速度、内存消耗和内联(inline)代码等方面进行了优化。

2、存储在Qt容器类中的数据必须是可赋值的数据类型,即,这种数据类型必须提供一个默认的构造函数(不需参数的构造函数)、一个复制构造函数和一个赋值操作运算符。

3、这些数据类型包含通常使用的大多数数据类型,包括基本数据类型(如int、double等)和Qt的一些数据类型(如QString、QDate、QTime等)。但是,Qt的QObject的及其子类(如QWidget、QDialog等)是不能存储在容器中的,例如:

QList<QToolBar> list; //错误,因为QObject及其子类没有复制构造函数和赋值操作运算符。

但是,可以存储QObject及其子类的指针。 例如:

QList<QToolBar*> list;

4、Qt的容器类是可以嵌套的,例如:

QHash<QString, QList<double> >; //键类型是QString,值类型是QList<double>

注意:在最后两个“>”之间要保留一个空格,否则,编译器会将两个“>”解释为一个“>>”,导致无法通过编译。

5、Qt的容器类有两种遍历方法:
(1)Java风格的迭代器;
(2)STL风格的迭代器,效率略胜一筹。

6、QList类:
QList 维护了一个指针数组,该数组存储的指针指向QList存储的列表项的内容。因此,QList提供了基于下标的快速访问。
例:

QList<QString> m_list;
QString m_str("this is a test string");
m_list << m_str;
qDebug() << m_list[0] << "how are you";

7、QLinedList类:
不能使用下标,只能使用迭代器访问它的数据项。

8、QVector类:
既可以使用下标访问数据项,也可以使用迭代器访问数据项。

9、Java风格迭代器遍历容器:
对于每个容器类,Qt都提供了两种类型的Java风格迭代器数据类型,即,只读访问和读写访问。

例如:对于List类,只读迭代器类:QListIterator;读写迭代器类:QMutableListIterator。

Java风格迭代器的迭代点位于列表项的中间,而不是直接指向某个列表项。因此,它的迭代点或者在第一个列表项的前面,或者在两个列表项之间,或者在最后一个列表项之后。

(1)QList只读遍历:

    QList<int> m_list;
    m_list << 1 << 2 << 3 << 4 << 5;

    QListIterator<int> m_iterator(m_list); //Java风格迭代器遍历容器
    while (m_iterator.hasNext())  //Java风格迭代器遍历容器
    {
        qDebug() << m_iterator.next(); //跳过下一个列表项,并返回它跳过的列表项的内容。
    }

(2)QList读写遍历:

    int i = 0;
    QList<int> m_list;
    QMutableListIterator<int> m_mutableIterator(m_list);

    for (i = 0; i < 10; ++i)
    {
        m_mutableIterator.insert(i);
    }

    m_mutableIterator.toFront();

    while (m_mutableIterator.hasNext())
    {
        qDebug() << m_mutableIterator.next();  //遍历
    }

    for (m_mutableIterator.toBack(); m_mutableIterator.hasPrevious();)
    {
        if (m_mutableIterator.previous() % 2 == 0)
        {
            m_mutableIterator.remove();  //从后往前遍历,如果是偶数则删掉;如果是奇数,则乘10
        }else
        {
            m_mutableIterator.setValue(m_mutableIterator.peekNext() * 10);
        }
    }

    for (m_mutableIterator.toFront(); m_mutableIterator.hasNext();)
    {
        qDebug() << m_mutableIterator.next(); //遍历
    }

10、STL风格的迭代器遍历容器:
对于每个容器类,Qt也都提供了两种类型的STL风格迭代器数据类型,即,只读访问和读写访问。(只读的迭代器运行速度较快)

STL风格的迭代器的API是建立在指针操作基础上的,例如,“++”操作运算符移动迭代器到下一项(item),而“*”操作符是返回迭代器指向的项。

不同于Java风格的迭代器,STL风格的迭代器的迭代点直接指向列表项。

例如:QList 的只读迭代器类:QList::const_iterator;读写迭代器类:QList::iterator

    QList<int> m_list;
    for (int j = 0; j < 10; ++j)
    {
        m_list.insert(m_list.end(), j); /*在m_list.end()列表项之前插入一个新的列表项,m_list.end()返回一个容器最后列表项之后的虚拟列表项(是一个标记无效位置的迭代器)。*/
    }

    QList<int>::iterator m_listIterator;
    for (m_listIterator = m_list.begin(); m_listIterator != m_list.end(); ++m_listIterator)
    {
        qDebug() << *m_listIterator;
        *m_listIterator *= 10;
    }

    QList<int>::ConstIterator m_constIterator; //STL风格的迭代器
    for (m_constIterator = m_list.constBegin(); m_constIterator != m_list.constEnd(); ++m_constIterator)  //STL风格的迭代器
    {
        qDebug() << *m_constIterator;
    }

11、QMap类和QHash类

(1)区别:

QHash类查找速度更快;
QHash以任意顺序存储数据项;
QHash的键类型Key必须提供operator==() 和一个全局的 qHash(Key)
函数,而QMap的键类型Key必须提供operator<()函数。
(2)QMap类:
为了支持一键多值,QMap提供了 QMap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值