• QVector
  • QList
  • QStringList
  • QSet
  • QMap
  • 自定义类的排序

容器是通用类,用于将给定类型的项存储在内存中。C++有标准模板库(STL)有自己的容器。在Qt中可以使用Qt容器或STL容器。
有两种容器:顺序和关联。顺序容器一个接一个地存储项目,而关联容器存储键值对。QList, QVector, QLinkedList 属于顺序容器;QMap , QHash属于关联容器。

QVector

QVector是一个提供动态数组的模板类。它将其元素存储在相邻的内存位置,并提供快速的基于索引的访问。对于大型不连续的元素,插入操作较慢,建议使用QList

// myvector.cpp
#include <QVector>
#include <QTextStream>int main(void) {QTextStream out(stdout);QVector<int> vals = {1, 2, 3, 4, 5}; // 创建一个整型的容器// size()方法获取容器长度,即元素数量out << "The size of the vector is: " << vals.size() << endl;// first()返回容器的第一个元素,last()返回容器的最后一个元素out << "The first item is: " << vals.first() << endl;out << "The last item is: " << vals.last() << endl;vals.append(6); // append()在容器最后一个元素之后添加vals.prepend(0);   // prepend()在容器的第一个元素之前添加元素out << "Elements: "; // 通过容器输出容器内容for (int val : vals) {out << val << " ";}    out << endl;return 0;
}

输出结果为:

$ ./myvector
The size of the vector is: 5
The first item is: 1
The last item is: 5
Elements: 0 1 2 3 4 5 6 

QList

QList是创建元素列表的容器,它与QVector类似,它存储值列表并提供快速的基于索引的访问以及快速插入和删除。它是Qt中最常用的容器之一。

// mylist.cpp
#include <QTextStream>
#include <QList>
#include <algorithm>int main(void) {QTextStream out(stdout);// 创建一个QList容器QList<QString> authors = {"Balzac", "Tolstoy", "Gulbranssen", "London"};for (int i=0; i < authors.size(); ++i) {out << authors.at(i) << endl;}  // 通过<<操作符像容器中添加两个新的元素authors << "Galsworthy" << "Sienkiewicz";out << "***********************" << endl;// std::sort()采用升序的方法对容器内容进行排序std::sort(authors.begin(), authors.end());out << "Sorted:" << endl;for (QString author : authors) {out << author << endl;}
}

输出结果为:

$ ./mylist
Balzac
Tolstoy
Gulbranssen
London
***********************
Sorted:
Balzac
Galsworthy
Gulbranssen
London
Sienkiewicz
Tolstoy

QStringList

QStringList是一个便利的容器,用于提供字符串列表。它具有快速的基于索引的访问以及快速插入和删除。

// mystringlist.cpp
#include <QTextStream>
#include <QList>int main(void) {QTextStream out(stdout);QString string = "coin, book, cup, pencil, clock, bookmark";QStringList items = string.split(",");QStringListIterator it(items);while (it.hasNext()) {out << it.next().trimmed() << endl;    }
}

在这个例子中,我们从一个字符串中创建一个字符串列表并将这些元素打印到控制台中。

QString string = "coin, book, cup, pencil, clock, bookmark";
QStringList items = string.split(",");

QStringsplit()方法根据提供的分隔符将字符串切割成子字符串。子字符串返回列表中。

QStringListIterator it(items);

QStringListIteratorQStringList提供了一个java样式的const迭代器。

while (it.hasNext()) {out << it.next().trimmed() << endl;
}

hasNext()方法用于判断是否到达容器的最后一个元素,trimmed()用于对字符串序列中元素的空格进行修剪(大概就是在不应该出现的地方删除空格,例如每个单词最前面和最后面的)。
输出结果为:

$ ./mystringlist
coin
book
cup
pencil
clock
bookmark

QSet

qset提供了一个快速查找的单值数学集。这些值以未指定的顺序存储。

// myset.cpp
#include <QSet>
#include <QList>
#include <QTextStream>
#include <algorithm>int main(void) {QTextStream out(stdout);// 创建了两个颜色集合,并且blue在两个集合中都存在QSet<QString> cols1 = {"yellow", "red", "blue"};QSet<QString> cols2 = {"blue", "pink", "orange"};// size()方法返回集合的大小out << "There are " << cols1.size() << " values in the set" << endl;// insert()方法用于向集合中添加元素cols1.insert("brown");out << "There are " << cols1.size() << " values in the set" << endl;cols1.unite(cols2);out << "There are " << cols1.size() << " values in the set" << endl;for (QString val : cols1) {out << val << endl;}QList<QString> lcols = cols1.values();std::sort(lcols.begin(), lcols.end());out << "*********************" << endl;out << "Sorted:" << endl;for (QString val : lcols) {out << val << endl;}    return 0;
}

在这个例子中,QSet用于存储颜色。

cols1.unite(cols2);

unite()方法将两个集合合并。cols1集合将从cols2集合中插入所有cols1中不存在的元素。

QList<QString> lcols = cols1.values();
std::sort(lcols.begin(), lcols.end());

不支持对一个集合进行排序。但是可以从一个集合中创建一个列表并对其进行排序。values()方法返回一个包含集合中元素的新QListQList中元素的顺序是未定义的。
输出结果为:

$ ./myset
There are 3 values in the set
There are 4 values in the set
There are 6 values in the set
blue
orange
red
brown
pink
yellow
*********************
Sorted:
blue
brown
orange
pink
red
yellow

QMap

QMap是一个存储键值对的关联型数组(字典)。提供了与键关联的值的快速查找。

// myqmap.cpp
#include <QTextStream>
#include <QMap>int main(void) {QTextStream out(stdout);// 创建一个QMapQMap<QString, int> items = { {"coins", 5}, {"books", 3} };// 通过insert()方法添加元素items.insert("bottles", 7);QList<int> values = items.values();out << "Values:" << endl;for (int val : values) {out << val << endl;}QList<QString> keys = items.keys();out << "Keys:" << endl;for (QString key : keys) {out << key << endl;}    // QMapIterator是QMap的java样式迭代器,用来迭代map的元素。QMapIterator<QString, int> it(items);out << "Pairs:" << endl;while (it.hasNext()) {it.next();out << it.key() << ": " << it.value() << endl;    }
}

在这个例子中,我们有一个字典,我们将字符串键映射到整数值。

QList<int> values = items.values();out << "Values:" << endl;for (int val : values) {out << val << endl;
}

获取字典的所有值并将它们打印到控制台。values()方法返回一个映射值列表。

QList<QString> keys = items.keys();out << "Keys:" << endl;
for (QString key : keys) {out << key << endl;
} 

同样,我们打印字典的所有键。keys()方法返回一个包含字典中所有键的列表。

while (it.hasNext()) {it.next();out << it.key() << ": " << it.value() << endl;
}

在迭代器的帮助下,我们遍历map的所有元素。key()方法返回当前键,value()方法返回当前值。
输出结果为:

$ ./mymap
Values:
3
7
5
Keys:
books
bottles
coins
Pairs:
books: 3
bottles: 7
coins: 5

自定义类的排序

在下面的例子中,我们将在QList中对自定义类的对象进行排序。

// book.h
class Book {public:Book(QString, QString);QString getAuthor() const;QString getTitle() const;private:            QString author;QString title;
};

这是我们自定义Book类的头文件。

// book.cpp
#include <QString>
#include "book.h"Book::Book(QString auth, QString tit) {author = auth;title = tit;
}QString Book::getAuthor() const {return author;
}QString Book::getTitle() const {return title;
}

这是Book类的实现,有两个访问器方法。

// sortcustomclass.cpp
#include <QTextStream>
#include <QList>
#include <algorithm>
#include "book.h"// compareByTitle()是排序算法使用的比较函数。
bool compareByTitle(const Book &b1, const Book &b2) {return b1.getTitle() < b2.getTitle();
}int main(void) {QTextStream out(stdout);QList<Book> books = {Book("Jack London", "The Call of the Wild"),Book("Honoré de Balzac", "Father Goriot"),Book("Leo Tolstoy", "War and Peace"),Book("Gustave Flaubert", "Sentimental education"),Book("Guy de Maupassant", "Une vie"),Book("William Shakespeare", "Hamlet")};// std::sort算法按书的标题对列表中的书籍进行排序。std::sort(books.begin(), books.end(), compareByTitle);for (Book book : books) {out << book.getAuthor() << ": " << book.getTitle() << endl;}
}

在这个例子中,我们创建了一些Book对象,并用std::sort算法对它们进行排序。
输出结果为:

$ ./sortcustomclass
Honoré de Balzac: Father Goriot
William Shakespeare: Hamlet
Gustave Flaubert: Sentimental education
Jack London: The Call of the Wild
Guy de Maupassant: Une vie
Leo Tolstoy: War and Peace

Qt学习(12)——Qt5中的容器相关推荐

  1. Qt学习笔记-Qt5程序开机自启动(windows)

    原博文地址为:https://blog.csdn.net/x356982611/article/details/53183144 简介 window下开机启动最简单的实现方式就是在注册表中添加启动项目 ...

  2. Qt工作笔记-Qt5中中文编码方面的笔记

    目前在使用国内的数据库和实时库接口. 说句实话,国内的东西与国外的东西比,在用户体验和接口调用上比还是存在很大的距离. 个人喜欢用QString去存储数据.个人感觉QTL比STL开发起来要快点 这里有 ...

  3. Scrapy框架的学习(12. scrapy中的模拟登陆,发送post请求模拟登陆)

    1.在有的网站的的登录的界面上,有用户名以及输入密码的输入框 然后输入账号和密码进去,点击登录,后台就会把得到的数据发送过去,验证之后然后就登录成功了,就会跳转到 响应的登录之后的网站 2. 我们可以 ...

  4. Qt 5.12 LTS(长期维护版本)中Qt Quick的性能改进

    我们一直致力于提高Qt的性能和优化其内存消耗.Qt 5.12的一个重点关注是在于减少QML引擎的内存消耗和优化JavaScript性能. 与上一个长期支持版Qt 5.6 LTS相比,Qt 5.9 LT ...

  5. QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64)

    QT学习笔记(三):Qt软件打包发布(QT5.8 _msvc2013_64+Win10_64) 1.编译方式介绍: 2.动态编译方式打包发布QT程序: 方法一:手动复制 方法二:使用工具 问题& ...

  6. Qt 5.12学习笔记--QML性能策略

    Qt 5.12学习笔记--QML性能策略 1 简介 2 时间因素 2 性能分析 3 JavaScript 部分 4 绑定 5 类型转换 6 解析属性 6 属性绑定 7 序列提示(Sequence ti ...

  7. Lesson 12.1 深度学习建模实验中数据集生成函数的创建与使用

    Lesson 12.1 深度学习建模实验中数据集生成函数的创建与使用   为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件.具备某些特性的数据集.相比于传统的机器学 ...

  8. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

  9. QT学习笔记(八):顺序容器和关联容器

    QT学习笔记(八):顺序容器和关联容器 一.前言 二.容器介绍 2.1 顺序容器 2.2 关联容器 二.顺序容器示例 三.关联容器 一.前言 在Qt库中为我们提供了一系列的基于模板的容器类(conta ...

最新文章

  1. php try 并回滚,ThinkPHP异常处理、事务处理(事务回滚)
  2. 一顿骚操作!我将 SQL 耗时从 30248.271s 优化到 0.001s
  3. 使用Slf4j查看日志输出
  4. Oracle数据库DECODE函数的使用.
  5. Duplicate Observed Data(复制“被监视数据”)
  6. MQ java.lang.OutOfMemoryError: unable to create new native thread
  7. html动态网站维护页面
  8. 美国百亿亿次超算要比中国晚两三年,但真实性能更恐怖
  9. 微软物联网服务器,靠近物联网 微软发布定制 Linux内核
  10. ORA-00906 missing left parenthesis括号
  11. Oracle expdp和impdp
  12. 自学python-自学python编程的方法路线
  13. as安装过程中gradle_电磁阀在安装过程中需注意的一些细节
  14. (转载)C#控件缩写规范
  15. MIF/MID数据格式说明
  16. 光纤传输网的发展及其新的分层结构
  17. word页边距调整步骤
  18. GitLab允许开发人员推送到master分支
  19. mmdetection特征可视化V2
  20. Fedora 34 Workstation安装后的配置

热门文章

  1. 云管理平台(CMP)介绍
  2. K8S云管平台开发实践 - Dockerfile
  3. 陶泓达:周五黄金原油白银走势分析及操作建议
  4. 职称计算机80分合格,达江发话:这样备考中级职称 考不了80分算我输!
  5. mysql的读已提交和可重复读(Read Committed和Repeatable Read隔离级别)
  6. Win11 KB5019157(22000.1281)11月累积补丁推送了!
  7. freebsd安装应用
  8. XMD:使用Github Pages搭建个人站点,更换博客专属域名
  9. HTML5 新增input属性
  10. ORACLE各种对象、概念及关系整理(一文读懂)