以下是对Qt中容器类、其他常用基础类等的详细介绍:
容器类
顺序容器类
- QList:是Qt中最常用的顺序容器类,它以数组的形式存储元素,提供快速的索引访问和插入/删除操作。在内存中是连续存储的,当在列表中间插入或删除元素时,可能需要移动大量元素,但在列表末尾进行操作通常很快。例如:
cpp
QList<int> list;
list << 1 << 2 << 3 << 4 << 5;
list.append(6);
list.insert(2, 7);
int value = list[3];
- QVector :类似于C++ 中的
std::vector
,也是动态数组。它在连续的内存块中存储元素,对于随机访问非常高效,但在插入和删除元素时,如果需要移动大量元素,性能可能会下降。适用于需要频繁随机访问元素的场景。例如:
cpp
QVector<double> vector;
vector.push_back(1.1);
vector.push_back(2.2);
double sum = 0;
for (int i = 0; i < vector.size(); ++i) {
sum += vector[i];
}
- QLinkedList:是一个双向链表容器类,它的优势在于插入和删除元素的速度非常快,无论在链表的哪个位置进行操作,都只需要修改指针,不需要移动大量元素。但随机访问性能较差,因为需要遍历链表来找到指定位置的元素。例如:
cpp
QLinkedList<QString> linkedList;
linkedList.append("apple");
linkedList.append("banana");
linkedList.prepend("cherry");
QLinkedList<QString>::iterator it = linkedList.begin();
while (it!= linkedList.end()) {
qDebug() << *it;
++it;
}
关联容器类
- QMap:是一个基于红黑树实现的关联容器,以键值对的形式存储数据,按键的顺序自动排序。提供高效的插入、查找和删除操作,适用于需要按键快速查找对应值的场景。例如:
cpp
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
int value = map.value("two");
QMap<QString, int>::iterator it = map.find("three");
if (it!= map.end()) {
qDebug() << "Key: " << it.key() << ", Value: " << it.value();
}
- QHash:也是一种关联容器,它使用哈希表来存储键值对,提供更快的查找速度,但元素的顺序是不确定的。适用于对查找速度要求极高,而对元素顺序不敏感的场景。例如:
cpp
QHash<QString, QString> hash;
hash.insert("name", "John");
hash.insert("age", "30");
hash.insert("city", "New York");
QString value = hash.value("age");
QHash<QString, QString>::iterator it = hash.find("city");
if (it!= hash.end()) {
qDebug() << "Key: " << it.key() << ", Value: " << it.value();
}
- QMultiMap 和 QMultiHash :分别是
QMap
和QHash
的变体,允许一个键对应多个值,适用于需要存储多个相同键值对的情况。例如:
cpp
QMultiMap<QString, int> multiMap;
multiMap.insert("key", 1);
multiMap.insert("key", 2);
multiMap.insert("key", 3);
QList<int> values = multiMap.values("key");
for (int value : values) {
qDebug() << value;
}
遍历容器的数据
- 迭代器遍历 :对于顺序容器和关联容器都适用。例如,遍历
QList
和QMap
:
cpp
QList<int> list = {1, 2, 3, 4, 5};
QList<int>::iterator listIt;
for (listIt = list.begin(); listIt!= list.end(); ++listIt) {
qDebug() << *listIt;
}
QMap<QString, int> map;
map.insert("one", 1);
map.insert("two", 2);
map.insert("three", 3);
QMap<QString, int>::iterator mapIt;
for (mapIt = map.begin(); mapIt!= map.end(); ++mapIt) {
qDebug() << "Key: " << mapIt.key() << ", Value: " << mapIt.value();
}
- 范围遍历 :C++11 引入的基于范围的
for
循环在Qt中也可以方便地遍历容器。例如:
cpp
QList<QString> stringList = {"apple", "banana", "cherry"};
for (const QString& str : stringList) {
qDebug() << str;
}
QMap<int, QString> intStringMap;
intStringMap.insert(1, "one");
intStringMap.insert(2, "two");
intStringMap.insert(3, "three");
for (const auto& pair : intStringMap) {
qDebug() << "Key: " << pair.first << ", Value: " << pair.second;
}
其他常用的基础类
QVariant类
- 功能概述 :
QVariant
类是一个通用的数据类型容器,它可以存储多种不同类型的数据,如基本数据类型、Qt 容器类、自定义类型等。常用于在不同的函数或模块之间传递不确定类型的数据,或者在需要处理多种类型数据的场景中。 - 示例:
cpp
QVariant variant;
variant = 10;
qDebug() << variant.toInt();
variant = "Hello";
qDebug() << variant.toString();
QList<int> list = {1, 2, 3};
variant = QVariant::fromValue(list);
QList<int> retrievedList = variant.value<QList<int>>();
for (int value : retrievedList) {
qDebug() << value;
}
QFlags类
- 功能概述 :
QFlags
类是一个模板类,用于方便地处理位标志。它允许将多个枚举值组合在一起,通过按位或操作来表示多种状态的组合,常用于表示具有多个可选状态的情况,如窗口的样式、按钮的状态等。 - 示例:
cpp
enum class MyFlag {
Flag1 = 0x01,
Flag2 = 0x02,
Flag3 = 0x04
};
Q_DECLARE_FLAGS(MyFlags, MyFlag)
Q_FLAG(MyFlags)
MyFlags flags = MyFlag::Flag1 | MyFlag::Flag3;
if (flags.testFlag(MyFlag::Flag1)) {
qDebug() << "Flag1 is set";
}
flags &= ~MyFlag::Flag3;
if (!flags.testFlag(MyFlag::Flag3)) {
qDebug() << "Flag3 is cleared";
}
QRandomGenerator类
- 功能概述 :
QRandomGenerator
类用于生成随机数。它提供了高质量的随机数生成功能,支持多种随机数分布,如均匀分布、正态分布等,可以满足不同的随机数需求。 - 示例:
cpp
QRandomGenerator generator;
int randomNumber = generator.bounded(100);
qDebug() << "Random number between 0 and 99: " << randomNumber;
double randomDouble = generator.generateDouble();
qDebug() << "Random double between 0 and 1: " << randomDouble;