Qt5 入门教程-第4章 容器QVector, QList, QStringList, QSet, and QMap

Qt5 入门教程-第4章 容器QVector, QList, QStringList, QSet, and QMap大道至简 在 Qt5 C 入门教程的这一部分 我们将讨论容器 QVector QList QStringList QSet and QMap 容器是一种通用类 用于在内存中存储给定类型的元素 C 有标准模板库 STL 其中

大家好,欢迎来到IT知识分享网。

大道至简,在 Qt5 C++入门教程的这一部分,我们将讨论容器(QVector, QList, QStringList, QSet, and QMap)。

容器是一种通用类,用于在内存中存储给定类型的元素。C++ 有标准模板库(STL),其中包含其自身的容器。在 Qt 中,我们既可以使用 Qt 的容器,也可以使用 STL 容器。

容器有两种类型:顺序容器和关联容器。顺序容器将元素一个接一个地存储,而关联容器则存储键值对。QList、QVector、QLinkedList 属于顺序容器;QMap 和 QHash 是关联容器的示例。

由于在本章中我们创建的是命令行程序,因此不需要 Qt 的图形用户界面(GUI)模块。我们可以在项目文件中添加QT -= gui声明。

Qt5 QVector

QVector 是一个模板类,提供了一个动态数组。它将元素存储在相邻的内存位置,并提供基于索引的快速访问。对于大型向量,插入操作会比较慢,此时建议使用 QList 容器。

  • myvector.cpp
#include <QVector> #include <QTextStream> int main(void) { QTextStream out(stdout); QVector<int> vals = {1, 2, 3, 4, 5}; out << "向量的大小是: " << vals.size() << endl; out << "第一个元素是: " << vals.first() << endl; out << "最后一个元素是: " << vals.last() << endl; vals.append(6); vals.prepend(0); out << "元素: "; for (int val : vals) { out << val << " "; } out << endl; return 0; }

这个示例使用了一个整数向量。

QVector<int> vals = {1, 2, 3, 4, 5};创建了一个整数向量。

for (int val : vals) { out << val << " "; }

我们通过for循环遍历向量,并打印其内容。

$ ./myvector 向量的大小是: 5 第一个元素是: 1 最后一个元素是: 5 元素: 0 1 2 3 4 5 6

Qt5 QList

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

  • mylist.cpp
#include <QTextStream> #include <QList> #include <algorithm> int main(void) { QTextStream out(stdout); 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(authors.begin(), authors.end()); out << "已排序:" << endl; for (QString author : authors) { out << author << endl; } return 0; } 

这个示例展示了 QList 容器。

for (int i=0; i < authors.size(); ++i) { out << authors.at(i) << endl; } 

在for循环中,我们遍历容器并打印其元素。at方法返回给定索引处的元素。

out << "已排序:" << endl; for (QString author : authors) { out << author << endl; } 

现在我们打印已排序的列表。

$ ./mylist Balzac Tolstoy Gulbranssen London * 已排序: 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; } return 0; } 

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

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

通过创建的迭代器,我们将列表的元素打印到终端。trimmed方法会去除字符串元素中的空白字符。

$ ./mystringlist coin book cup pencil clock bookmark

Qt5 QSet

QSet 提供了一个单值的数学集合,具有快速查找功能。值以未指定的顺序存储。

  • myset.cpp
#include <QSet> #include <QList> #include <QTextStream> #include <algorithm> int main(void) { QTextStream out(stdout); QSet<QString> cols1 = {"yellow", "red", "blue"}; QSet<QString> cols2 = {"blue", "pink", "orange"}; out << "集合中有 " << cols1.size() << " 个值" << endl; cols1.insert("brown"); out << "集合中有 " << cols1.size() << " 个值" << endl; cols1.unite(cols2); out << "集合中有 " << cols1.size() << " 个值" << endl; for (QString val : cols1) { out << val << endl; } QList<QString> lcols = cols1.values(); std::sort(lcols.begin(), lcols.end()); out << "*" << endl; out << "已排序:" << endl; for (QString val : lcols) { out << val << endl; } return 0; }

在这个示例中,QSet 用于存储颜色。多次指定同一个颜色值是没有意义的。

for (QString val : cols1) { out << val << endl; } 

通过for循环,我们打印cols1集合中的所有元素。

$ ./myset 集合中有 3 个值 集合中有 4 个值 集合中有 6 个值 pink orange brown blue yellow red * 已排序: blue brown orange pink red yellow 

Qt5 QMap

QMap 是一个关联数组(字典),用于存储键值对。它提供了根据键快速查找对应值的功能。

  • myqmap.cpp
#include <QTextStream> #include <QMap> int main(void) { QTextStream out(stdout); QMap<QString, int> items = { {"coins", 5}, {"books", 3} }; items.insert("bottles", 7); QList<int> values = items.values(); out << "值:" << endl; for (int val : values) { out << val << endl; } QList<QString> keys = items.keys(); out << "键:" << endl; for (QString key : keys) { out << key << endl; } QMapIterator<QString, int> it(items); out << "键值对:" << endl; while (it.hasNext()) { it.next(); out << it.key() << ": " << it.value() << endl; } return 0; }

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

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

我们获取字典的所有值,并将它们打印到控制台。values方法返回一个包含字典值的列表。

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

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

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

借助迭代器,我们遍历映射的所有元素。key方法返回当前键,value方法返回当前值。

$ ./myqmap 值: 3 7 5 键: books bottles coins 键值对: 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" 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(books.begin(), books.end(), compareByTitle); for (Book book : books) { out << book.getAuthor() << ": " << book.getTitle() << endl; } return 0; } 

在这个示例中,我们创建了几个 Book 对象,并使用std::sort算法对它们进行排序。

bool compareByTitle(const Book &b1, const Book &b2) { return b1.getTitle() < b2.getTitle(); }

compareByTitle是一个用于排序算法的比较函数

$ ./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

主要区别

  1. QVector:类似数组,元素连续存储。随机访问快,在末尾添加元素高效,但中间插入慢。
  2. QList:类似数组,综合性能好,随机访问与插入删除较均衡。
  3. QStringList:QList 对字符串的特化,用于处理字符串列表。
  4. QSet:用哈希表实现,元素唯一,查找、插入、删除速度快,元素无序。
  5. QLinkedList:双向链表结构,顺序访问方便,任意位置插入删除快,随机访问慢。
  6. QMap:基于红黑树,键值对存储,键唯一且自动排序,查找键对应值速度快。
  7. QHash:哈希表存储键值对,键唯一,查找速度比 QMap 更快,元素无序。

应用场景

  1. QVector:适用于需频繁随机访问元素,且插入删除多在尾部的场景,如存储图像像素数据。
  2. QList:用于随机访问和插入删除操作都有的综合场景,如存储用户界面元素列表。
  3. QStringList:处理字符串集合,像分割字符串、存储文件路径列表。
  4. QSet:确保元素唯一性,需快速判断元素是否存在时使用,如统计文章中不同单词。
  5. QLinkedList:适合频繁在中间插入删除元素的场景,如实现任务调度队列。
  6. QMap:需键值映射且键要有序的情况,如按字母顺序存储单词及其释义。
  7. QHash:对查找性能要求高的键值映射场景,如缓存系统。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/181299.html

(0)
上一篇 2025-06-19 11:26
下一篇 2025-06-19 11:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信