在Qt5的这部分教程中,将讨论Qt5中的容器。将提到以下容器:QVector, QList, QStringList, QSet和QMap。
容器是在内存中存储指定类型项目的通用类。C++有标准模板库(STL),它有其自己的容器。在Qt中,我们可以使用Qt容器或者STL容器。
有两类容器:顺序和关系。顺序容器一个接着一个存储项目,而关系容器存储键值对。QList,QVector,QLinkedList属于顺序容器;QMap和QHash是关系容器的示例。
由于在本章中,我们创建了命令行程序,我们不需要Qt GUI模块。我们可以添加Qt -= gui声明到项目文件。
Qt5 QVector
QVector是一个模板类,它提供了一个动态数组。它在相邻内存位置存储它的项目并且提供快速基于索引的访问。对于大型矢量,插入操作更慢而推荐使用QList容器替代。
/*
本例使用整数向量。
*/
# include
# include
int main()
{
QTextStream out(stdout);
// 创建一个整数向量。
QVector vals = {1,2,3,4,5,6};
// size方法给出了这个向量的尺寸--在此向量中的项目数。
out
程序执行结果如下:
[blctrl@localhost build-containers-Desktop-Debug]$ ./containers
The size of the vector is: 6
The first item is: 1
The last item is: 6
Elements:0 1 2 3 4 5 6 7
Qt5 QList
QList是一个用于创建一个元素列表的容器。它类似于QVector。它存储一个值的列表,并且提供快速的基于索引的访问,以及快速插入和移除。它是在Qt中最常用的容器之一。
/* 本例展示了QList容器 */
void testQList(QTextStream &out)
{
// 创建一个QList容器。并且存储了城市名称。
QList cities = {"Shanghai", "Beijing", "Tianjing", "Chongqing"};
out
以上程序调用结果如下:
======================================================
Shanghai
Beijing
Tianjing
Chongqing
*********************
Sorted:
Beijing
Chongqing
Hangzhou
Shanghai
Shenzheng
Tianjing
======================================================
Qt5 QStringList
QStringList是一个提供字符串列表的快捷容器。它有快速的基于索引的访问以及快速插入和移除。
/* 在这个示例中,我们从一个字符串创建了一个字符串列表并且打印元素到console */
void testQStringList(QTextStream &out)
{
QString strings = "coin, book, cup, pencil, clock, bookmark";
// QString的split方法根据提供的分隔符把字符串切成子串。在一个列表中返回这些子串。
QStringList items = strings.split(",");
// QStringListIterator提供了Java风格用于QStringList的const迭代器。
QStringListIterator it(items);
out
以上代码运行结果:
======================================================
coin
book
cup
pencil
clock
bookmark
======================================================
Qt5 QSet
QSet提供了一个可以快速查找的单值数学集合。不按顺序存储这些值。
/* 在本例中,QSet用于存储颜色, 它使得指定一种颜色多次没有意义 */
void testQSet(QTextStream &out)
{
// 创建颜色值的两个集合。在两个集合中都有蓝色。
QSet cols1 = {"yellow", "red", "blue"};
QSet cols2 = {"blue", "pink", "orange"};
out lcols = cols1.values();
std::sort(lcols.begin(), lcols.end());
for (QString val : lcols){
out
执行以上程序的结果:
======================================================
There are 3 values in the set
There are 4 values in the set
There are 6 values in the set
yellow
red
pink
brown
orange
blue
************************************************************
blue
brown
orange
pink
red
yellow
======================================================
Qt5 QMap
QMap是一个关系数组(字典),它存储键值对。它提供了用键查找关联值的快速查找。
/* 在本例中,我们创建了一个字典,我们在这个字典中映射字符串键到整数值 */
void testQMap(QTextStream &out)
{
out items = {{"coins", 5},{"books", 3}};
// 用insert方法插入一个新对。
items.insert("bottles", 7);
// 获取这个字典的所有值,并且打印它们到console。values方法返回一个map值列表。
QList values = items.values();
out keys = items.keys();
for (QString key: keys){
out it(items);
out
运行以上代码,结果如下:
======================================================
Values:
3
7
5
*****************************************************
books
bottles
coins
*****************************************************
Pairs:
key: books value:3
key: bottles value:7
key: coins value:5
======================================================
自定义类排序
/* 在以下示例中,我们在QList中排序一个自定义类的对象 */
//book.h 这是自定义Book类的头文件
#ifndef BOOK_H
#define BOOK_H
#include
class Book
{
public:
Book(QString, QString);
QString getAuthor() const;
QString getTitle() const;
private:
QString author;
QString title;
};
#endif // BOOK_H
/* book.cpp 这是Book类的实现,有两个访问方法 */
#include "book.h"
#include
Book::Book(QString auth, QString tit)
{
author = auth;
title = tit;
}
QString Book::getAuthor() const
{
return author;
}
QString Book::getTitle() const
{
return title;
}
/* main.cpp 主程序:本例中,创建了一些book对象,并且用std::sort算法对它们排序 */
#include "book.h"
bool compareByTitle(const Book &b1, const Book &b2) {
return b1.getTitle() 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")
};
// 排序算法使用了排序函数compareByTitle
std::sort(books.begin(), books.end(), compareByTitle);
for (Book book : books){
out
运行上程序,结果按作者名字降序排列,如下:
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
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 一步到位:三行CSS代码轻松实现全网站暗黑模式Hello Darkness, My Old Friend
本文首发于微信公众号:大迁世界, 我的微信:qq449245884,我会第一时间和你分享前端行业趋势,学习途径等等。更多开源作品请看 GitHub https://github.com/qq449245884/xiaozhi ,包含一线大厂面试完整考点、资料以…