c++ Qt框架中的各种集合详解

这篇具有很好参考价值的文章主要介绍了c++ Qt框架中的各种集合详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C++ Qt框架中的各种集合详解

一、QList

QList是一个动态数组,类似于C++标准库的std::vector。它可以存储各种类型的元素,并提供了插入、删除和访问元素的方法。

#include <QList>

int main() {
    QList<int> numbers;
    numbers << 1 << 2 << 3 << 4;

    // 访问元素
    int secondNumber = numbers.at(1); // 2

    // 插入元素
    numbers.insert(2, 5);

    // 删除元素
    numbers.removeOne(3);

    return 0;
}
  • 添加和插入元素
QList<int> numbers;
numbers.append(1);        // 在末尾添加元素
numbers.prepend(0);       // 在开头添加元素
numbers.insert(2, 5);     // 在索引位置插入元素
  • 访问元素
int value = numbers.at(1);    // 访问索引为 1 的元素
int firstValue = numbers.first(); // 第一个元素
int lastValue = numbers.last();   // 最后一个元素
  • 修改元素
numbers[0] = 10;            // 修改索引为 0 的元素
numbers.replace(1, 20);     // 替换索引为 1 的元素
  • 删除元素
numbers.removeAt(2);       // 移除索引为 2 的元素
numbers.removeOne(10);     // 移除第一个值为 10 的元素
numbers.removeAll(5);      // 移除所有值为 5 的元素
numbers.clear();           // 清空列表
  • 查找元素
int index = numbers.indexOf(20);      // 查找值为 20 的元素的索引
int lastIndex = numbers.lastIndexOf(20); // 查找最后一个值为 20 的元素的索引
bool contains = numbers.contains(30); // 判断是否包含值为 30 的元素
  • 遍历元素
foreach (int num, numbers) {
    // 遍历所有元素
}

for (int i = 0; i < numbers.size(); ++i) {
    int num = numbers[i];
    // 使用索引遍历
}
  • 获取列表信息
int size = numbers.size();     // 获取列表大小
bool isEmpty = numbers.isEmpty(); // 检查列表是否为空
  • 排序
numbers.sort();              // 对列表进行默认升序排序
numbers.sort(Qt::DescendingOrder); // 对列表进行降序排序
  • 复制和合并
QList<int> copy = numbers;       // 复制列表
QList<int> merged = numbers + otherList; // 合并两个列表
numbers << 100 << 200;         // 通过添加元素来合并列表

二、QVector

QVector 类似于 QList,但适用于需要高效连续内存存储的情况。

#include <QVector>

int main() {
    QVector<QString> names;
    names << "Alice" << "Bob" << "Charlie";

    // 使用索引访问元素
    QString secondName = names[1]; // "Bob"

    return 0;
}

QVector的常用的添加、修改、访问、修改、查找以及遍历元素的方式和QList是一致的,可以直接参考QList。

三、QMap

QMap 是一个关联数组,存储键-值对,键是唯一的,并按键的排序顺序排列。

#include <QMap>

int main() {
    QMap<QString, int> ageMap;
    ageMap.insert("Alice", 25);
    ageMap.insert("Bob", 30);
    ageMap.insert("Charlie", 28);

    // 通过键访问值
    int bobAge = ageMap.value("Bob"); // 30

    return 0;
}
  • 添加键值对
QMap<QString, int> ageMap;
ageMap.insert("Alice", 25);
ageMap.insert("Bob", 30);
ageMap["Charlie"] = 28; // 使用运算符重载添加键值对
  • 访问值
int aliceAge = ageMap.value("Alice"); // 获取键为 "Alice" 的值
int bobAge = ageMap["Bob"];           // 使用键访问值
  • 修改值
ageMap["Charlie"] = 29; // 修改键为 "Charlie" 的值
  • 删除键值对
ageMap.remove("Alice"); // 移除键为 "Alice" 的键值对
ageMap.clear();         // 清空映射
  • 检查键是否存在
bool containsBob = ageMap.contains("Bob"); // 检查是否包含键 "Bob"
  • 遍历键值对
foreach (const QString &name, ageMap.keys()) {
    int age = ageMap.value(name);
    // 遍历所有键值对的键
}

QMapIterator<QString, int> i(ageMap);
while (i.hasNext()) {
    i.next();
    QString name = i.key();
    int age = i.value();
    // 使用迭代器遍历键值对
}
  • 获取映射信息
int size = ageMap.size();    // 获取映射中键值对的数量
bool isEmpty = ageMap.isEmpty(); // 检查映射是否为空
  • 排序
    QMap 默认按照键的升序进行排序。如果需要自定义排序方式,可以使用自定义比较函数或者使用 QMap::insertMulti() 来插入多个相同键的值。
ageMap.insertMulti("Alice", 24);
ageMap.insertMulti("Alice", 26);
// 现在 ageMap["Alice"] 会包含多个值
  • 复制和合并
QMap<QString, int> copyMap = ageMap; // 复制映射
ageMap.unite(otherMap); // 合并映射,相同键的值会合并

四、QHash

QHash 是一个散列表,存储键-值对,具有快速查找性能,但不保持键的顺序。

#include <QHash>

int main() {
    QHash<QString, QString> cityCountry;
    cityCountry.insert("Paris", "France");
    cityCountry.insert("Tokyo", "Japan");
    cityCountry.insert("New York", "USA");

    // 使用键查找值
    QString tokyoCountry = cityCountry.value("Tokyo"); // "Japan"

    return 0;
}
  • 添加键值对
QHash<QString, int> ageHash;
ageHash.insert("Alice", 25);
ageHash.insert("Bob", 30);
ageHash["Charlie"] = 28; // 使用运算符重载添加键值对
  • 访问值
int aliceAge = ageHash.value("Alice"); // 获取键为 "Alice" 的值
int bobAge = ageHash["Bob"];           // 使用键访问值
  • 修改值
ageHash["Charlie"] = 29; // 修改键为 "Charlie" 的值
  • 删除键值对
ageHash.remove("Alice"); // 移除键为 "Alice" 的键值对
ageHash.clear();         // 清空哈希表
  • 检查键是否存在
bool containsBob = ageHash.contains("Bob"); // 检查是否包含键 "Bob"
  • 遍历键值对
foreach (const QString &name, ageHash.keys()) {
    int age = ageHash.value(name);
    // 遍历所有键值对的键
}

QHashIterator<QString, int> i(ageHash);
while (i.hasNext()) {
    i.next();
    QString name = i.key();
    int age = i.value();
    // 使用迭代器遍历键值对
}
  • 获取哈希表信息
int size = ageHash.size();    // 获取哈希表中键值对的数量
bool isEmpty = ageHash.isEmpty(); // 检查哈希表是否为空
  • 复制和合并
QHash<QString, int> copyHash = ageHash; // 复制哈希表
ageHash.unite(otherHash); // 合并哈希表,相同键的值会合并

五、QSet

QSet 是一个无序集合,存储不重复的值。它不会保持特定的顺序

#include <QSet>

int main() {
    QSet<int> numbers;
    numbers << 3 << 5 << 7 << 5; // 注意:重复的值只会存储一次

    // 判断值是否存在
    bool containsSeven = numbers.contains(7); // true

    return 0;
}
  • 添加值
QSet<QString> names;
names.insert("Alice");
names.insert("Bob");
  • 检查值是否存在
bool containsAlice = names.contains("Alice"); // 检查是否包含值 "Alice"
  • 删除值
names.remove("Alice"); // 移除值 "Alice"
names.clear();         // 清空集合
  • 遍历值
foreach (const QString &name, names) {
    // 遍历所有值
}

QSetIterator<QString> i(names);
while (i.hasNext()) {
    QString name = i.next();
    // 使用迭代器遍历值
}
  • 获取集合信息
int size = names.size();    // 获取集合中值的数量
bool isEmpty = names.isEmpty(); // 检查集合是否为空
  • 复制和合并
QSet<QString> copySet = names; // 复制集合
names.unite(otherSet); // 合并集合,会保留不重复的值

六、QLinkedList

QLinkedList 是一个双向链表,适用于频繁插入和删除操作,但是在访问元素时性能相对较差。

#include <QLinkedList>

int main() {
    QLinkedList<QString> names;
    names << "Alice" << "Bob" << "Charlie";

    // 在链表中插入元素
    names.insert(names.begin(), "David");

    // 从链表中移除元素
    names.removeOne("Bob");

    return 0;
}
  • 添加元素
QLinkedList<QString> names;
names.append("Alice");      // 在末尾添加元素
names.prepend("Bob");       // 在开头添加元素
names.insert(++names.begin(), "Charlie"); // 在指定位置插入元素
  • 访问元素
QString first = names.first(); // 获取第一个元素
QString last = names.last();   // 获取最后一个元素
  • 修改元素
*names.begin() = "David"; // 修改第一个元素
  • 删除元素
names.erase(names.begin()); // 移除第一个元素
names.removeOne("Charlie"); // 移除值为 "Charlie" 的元素
names.clear();              // 清空链表
  • 遍历元素
foreach (const QString &name, names) {
    // 遍历所有元素
}

QLinkedListIterator<QString> i(names);
while (i.hasNext()) {
    QString name = i.next();
    // 使用迭代器遍历元素
}
  • 获取链表信息
int size = names.size();    // 获取链表中元素的数量
bool isEmpty = names.isEmpty(); // 检查链表是否为空
  • 复制和合并
QLinkedList<QString> copyList = names; // 复制链表
names += otherList; // 合并链表

七、QStack

QStack 是一个堆栈,支持后进先出(LIFO)操作。

#include <QStack>

int main() {
    QStack<int> stack;
    stack.push(10);
    stack.push(20);
    stack.push(30);

    // 弹出栈顶元素
    int poppedValue = stack.pop(); // 30

    return 0;
}
  • 入栈
QStack<int> stack;
stack.push(10); // 将 10 入栈
stack.push(20); // 将 20 入栈
stack.push(30); // 将 30 入栈
  • 出栈
int poppedValue = stack.pop(); // 弹出栈顶元素,poppedValue = 30
  • 获取栈顶元素
int topValue = stack.top(); // 获取栈顶元素,但不弹出
  • 检查栈是否为空
bool isEmpty = stack.isEmpty(); // 检查栈是否为空
  • 获取栈的大小
int size = stack.size(); // 获取栈中元素的数量
  • 遍历栈
while (!stack.isEmpty()) {
    int value = stack.pop(); // 从栈中依次弹出所有元素
}

八、QQueue

QQueue 是一个队列,支持先进先出(FIFO)操作。

#include <QQueue>

int main() {
    QQueue<QString> tasks;
    tasks.enqueue("Task 1");
    tasks.enqueue("Task 2");
    tasks.enqueue("Task 3");

    // 出队列
    QString nextTask = tasks.dequeue(); // "Task 1"

    return 0;
}
  • 入队
QQueue<QString> tasks;
tasks.enqueue("Task 1"); // 将任务 1 入队
tasks.enqueue("Task 2"); // 将任务 2 入队
tasks.enqueue("Task 3"); // 将任务 3 入队
  • 出队
QString dequeuedTask = tasks.dequeue(); // 出队一个任务,dequeuedTask = "Task 1"
  • 获取队首元素
QString frontTask = tasks.first(); // 获取队首元素,但不出队
  • 检查队列是否为空
bool isEmpty = tasks.isEmpty(); // 检查队列是否为空
  • 获取队列的大小
int size = tasks.size(); // 获取队列中元素的数量
  • 遍历对列
while (!tasks.isEmpty()) {
    QString task = tasks.dequeue(); // 从队列中依次出队所有任务
}

九、QMultiMap

QMultiMap 是 Qt 中的一个关联数组集合类,允许一个键对应多个值。它类似于 QMap,但不同的是它允许多个相同的键存在,并且会按照键的插入顺序保持排序。

#include <QMultiMap>

int main() {
    QMultiMap<QString, int> scores;
    scores.insert("Alice", 90);
    scores.insert("Bob", 85);
    scores.insert("Alice", 95);

    // 获取所有 Alice 的分数
    QList<int> aliceScores = scores.values("Alice"); // [90, 95]

    return 0;
}
  • 创建和添加键值对
QMultiMap<QString, int> scores;
scores.insert("Alice", 90);
scores.insert("Bob", 85);
scores.insert("Alice", 95); // 允许同一个键对应多个值
  • 访问值
QList<int> aliceScores = scores.values("Alice"); // 获取键为 "Alice" 的所有值
  • 遍历键值对
foreach (const QString &name, scores.uniqueKeys()) {
    QList<int> values = scores.values(name);
    // 遍历所有键值对的键,并获取对应的值列表
}
  • 修改值
QList<int> aliceScores = scores.values("Alice");
if (!aliceScores.isEmpty()) {
    scores.insert("Alice", aliceScores.first() + 5); // 修改第一个值
}
  • 删除键值对
QList<int> aliceScores = scores.values("Alice");
if (!aliceScores.isEmpty()) {
    scores.insert("Alice", aliceScores.first() + 5); // 修改第一个值
}
  • 获取多重映射信息
int size = scores.size(); // 获取多重映射中键值对的数量
bool isEmpty = scores.isEmpty(); // 检查多重映射是否为空

十、QMultiHash

QMultiHash 是 Qt 中的一个散列表(哈希表)集合类,允许一个键对应多个值。与 QMultiMap 类似,但不同的是 QMultiHash不会保持键的插入顺序。

  • 创建和添加键值对
QMultiHash<QString, int> scores;
scores.insert("Alice", 90);
scores.insert("Bob", 85);
scores.insert("Alice", 95); // 允许同一个键对应多个值
  • 访问值
QList<int> aliceScores = scores.values("Alice"); // 获取键为 "Alice" 的所有值
  • 遍历键值对
QList<QString> keys = scores.keys(); // 获取所有键
foreach (const QString &key, keys) {
    QList<int> values = scores.values(key);
    // 遍历所有键值对的键,并获取对应的值列表
}
  • 修改值
QList<int> aliceScores = scores.values("Alice");
if (!aliceScores.isEmpty()) {
    scores.insert("Alice", aliceScores.first() + 5); // 修改第一个值
}
  • 删除键值对
scores.remove("Alice"); // 移除键为 "Alice" 的所有键值对
scores.remove("Alice", 95); // 移除键为 "Alice",值为 95 的键值对
scores.clear(); // 清空多重哈希
  • 获取多重哈希信息
int size = scores.size(); // 获取多重哈希中键值对的数量
bool isEmpty = scores.isEmpty(); // 检查多重哈希是否为空

QMultiHash 提供了一种使用散列表来实现多重映射的方式,适用于需要一个键可以对应多个值的情况。与 QMultiMap 不同的是,QMultiHash 不会保持键的插入顺序,因此在需要快速查找的场景中可能更具有优势。无论是需要一对一映射还是一对多映射,都可以根据需求选择适当的集合类。文章来源地址https://www.toymoban.com/news/detail-675767.html

到了这里,关于c++ Qt框架中的各种集合详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ Qt开发:Charts绘制各类图表详解

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 TreeWidget 与 QCharts 的常用方法及灵活运用。 在之前的文章中笔者介绍了如何使

    2024年02月04日
    浏览(33)
  • Qt中的各种编译器

    1.uic:UI编译器 ,将 .ui 文件转化为 ui_*.h 文件 2. rcc:资源编译器 ,将 .qrc 文件转换成 qrc_*.h 文件 3. moc:元对象编译器 ,将含有 Q_OBJECT 的头文件转换成标准 .h 文件 4.qmake : 把pro文件编译成makefile文件,然后可以调用make命令 5.MSVC:微软VC++编译器 6.MinGW:gcc编译器

    2024年02月15日
    浏览(32)
  • Qt 各种版本下载链接地址详解

    首先,下载地址是: Index of / (qt.io) https://download.qt.io/   下面是每个目录的详细说明: snapshots/:这个目录包含了尚未正式发布的Qt版本的快照。这些版本可能包含新功能、改进或者bug修复,但它们可能不够稳定,并且不建议在生产环境中使用。这些文件通常按日期进行命名。

    2023年04月08日
    浏览(21)
  • Qt/C++音视频开发51-推流到各种流媒体服务程序

    最近将推流程序完善了很多功能,尤其是增加了对多种流媒体服务程序的支持,目前支持mediamtx、LiveQing、EasyDarwin、nginx-rtmp、ZLMediaKit、srs、ABLMediaServer等,其中经过大量的对比测试,个人比较建议使用mediamtx和ZLMediaKit,因为这两者支持的格式众多,不仅同时支持rtsp/rtmp推流,

    2024年02月09日
    浏览(43)
  • [QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

    目录 2. QT程序的运行框架 2.1 Hello World程序框架 2.2 QT Designer初识 2.3 用QT Designer设计用户登录界 上述示例代码中,首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你的应用程序需要图形界面,则使用 QApplication,否则使用 QCoreApplication。然后,你可以

    2024年02月15日
    浏览(41)
  • 「Java」《Java集合框架详解:掌握常用集合类,提升开发效率》

    Java 集合框架是 Java 编程中不可或缺的一部分。它提供了一组强大的数据结构和算法,用于存储、操作和处理对象数据。本文将深入探讨 Java 集合框架的核心概念,介绍常用的集合接口和实现类,并提供实际应用示例,帮助读者更好地理解和应用集合框架,提升开发效率。

    2024年02月11日
    浏览(34)
  • Qt框架学习 --- CTK

    随着开发的深入,CTK框架还是要关注一下。了解CTK还是有必要的。本篇文章主要描述CTK框架加载带界面的插件,集成到主界面的操作。 什么是CTK? CTK怎么编译?这些就不赘述了,提供几个参考博客即可。 环境:Qt5.15.2 + vs2019(Qt6放弃吧,目前为止编不了;mingw也放弃吧,目前

    2024年02月02日
    浏览(25)
  • Qt5开发及实例V2.0-第七章-Qt图形视图框架

    7.1.1 Graphics View的特点 Graphics View框架结构的主要特点如下。 (1)Graphics View框架结构中,系统可以利用Qt绘图系统的反锯齿、OpenGL工具来改善绘图性能。 (2)Graphics View支持事件传播体系结构,可以使图元在场景(scene)中的交互能力提高1倍,图元能够处理键盘事件和鼠标事

    2024年02月07日
    浏览(34)
  • C++ Qt开发:Qt的安装与配置

    Qt是一种C++编程框架,用于构建图形用户界面(GUI)应用程序和嵌入式系统。Qt由Qt公司(前身为Nokia)开发,提供了一套跨平台的工具和类库,使开发者能够轻松地创建高效、美观、可扩展的应用程序。其被广泛用于开发桌面应用程序、嵌入式系统、移动应用程序等。无论是

    2024年02月05日
    浏览(38)
  • 详解Qt中的JSON操作

    JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,因其简洁的结构、易读性以及与多种编程语言的良好兼容性,在现代Web服务、API交互以及数据持久化场景中得到了广泛应用。Qt作为一款功能强大的跨平台应用开发框架,自Qt 5.0起便内置了对JSON的支持,提供了方便

    2024年04月29日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包