Qt容器类及其遍历(Java风格和STL风格迭代器)
来源:互联网 发布:剪辑视频的软件 编辑:程序博客网 时间:2024/06/17 22:23
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); while (m_iterator.hasNext()) { 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; for (m_constIterator = m_list.constBegin(); m_constIterator != m_list.constEnd(); ++m_constIterator) { qDebug() << *m_constIterator; }
11、QMap类和QHash类
(1)区别:
- QHash类查找速度更快;
- QHash以任意顺序存储数据项;
- QHash的键类型Key必须提供operator==() 和一个全局的 qHash(Key)
函数,而QMap的键类型Key必须提供operator<()函数。
(2)QMap类:
为了支持一键多值,QMap提供了 QMap
QMap<QString, QString> map_str; map_str.insert("beijing", "111"); map_str.insert("shanghai", "111"); map_str.insert("lvliang", "0358"); map_str.insert("taiyuan", "0351"); QMapIterator<QString, QString> java_Iter_Map(map_str); //只读 java_Iter_Map.toFront(); while (java_Iter_Map.hasNext()) { qDebug() << java_Iter_Map.key() << java_Iter_Map.next().value(); // 注意:取值是要用 next() } QMutableMapIterator<QString, QString> java_Iter_MutMap(map_str); //读写 java_Iter_MutMap.toFront(); while (java_Iter_MutMap.hasNext()) { if (java_Iter_MutMap.findNext("111")) /*java风格的迭代器没有提供查找键的函数。*/ { java_Iter_MutMap.setValue("010"); } } qDebug() << "\n"; java_Iter_MutMap.toFront(); while (java_Iter_MutMap.hasNext()) { qDebug() << java_Iter_MutMap.key() << java_Iter_MutMap.next().value(); }
- STL风格:
QMultiMap<QString, QString> STL_map; //一键多值的map STL_map.insert("zhangyuxin", "32"); STL_map.insert("zhengyuan", "33"); STL_map.insert("maxiang", "31"); STL_map.insert("maxiang", "399"); QMap<QString, QString>::const_iterator STL_const_ite; // 只读 for (STL_const_ite = STL_map.constBegin(); STL_const_ite != STL_map.constEnd(); ++STL_const_ite) { qDebug() << STL_const_ite.key() << STL_const_ite.value(); } QMap<QString, QString>::iterator STL_ite; for(STL_ite = STL_map.begin(); STL_ite != STL_map.end(); ++STL_ite) { if (STL_ite.key() == "maxiang") { STL_ite.value() = "31"; } qDebug() << STL_ite.key() << STL_ite.value(); }
12、QVaraint类
QVaraint 类似于C++中的联合(union)数据类型,不仅能保存很多Qt类型的值,包括QColor、QBrush、QFont等,也能存放Qt的容器类型的值。
QByteArray a = QByteArray(); //字节数组 QVariant variant("123"); //在Variant里面放字符串 QString i = variant.toString(); QDataStream out(&a, QIODevice::ReadWrite); //把字符串写入流中,放入字节数组中 out << i; for (int j = 0; j < a.size(); ++j) { qDebug() << a.at(j); }
- Qt容器类及其遍历(Java风格和STL风格迭代器)
- 遍历容器 Java风格和STL风格 foreach
- java foreach 风格遍历
- 编程风格(java)
- 和风格和风格化和风格和风格化风格化风格和风格化
- 和风格和风格化风格化风格和风格化风格化风格化
- Java风格
- 人机交互风格及其发展趋势
- 风格
- 风格
- 风格
- 风格
- 风格
- 风格
- 风格
- 风格
- Qt之模型/视图(自定义风格)
- Qt之模型/视图(自定义风格)
- 【黑科技】C++输入输出优化技巧
- day26_netstore
- CentOS7开启中文拼音输入法_设置方法
- Android获取屏幕实际高度跟显示高度,判断Android设备是否拥有虚拟功能键
- 关于kcptun加速ss配置的一些问题
- Qt容器类及其遍历(Java风格和STL风格迭代器)
- web前端面试题
- CSDN博客最新2017积分规则和获取积分方法
- CDH5.5启动Yarn的NodeManager报错
- PHP常见面试题和答案
- okhttp的使用极其缓存
- linux运维-系统操作
- Linux入门:线程同步与互斥(三)——信号量
- 美赛资料查找网址