QSet
是 Qt 框架中的一个容器类,用于存储唯一元素。QSet
内部使用哈希表实现,因此插入和查找操作的时间复杂度为 O(1)。QSet
可以存储基本数据类型(如整数、字符串等)以及自定义对象。
要向 QSet
中追加自定义对象,需要确保自定义对象重载了 operator==
和 qHash
函数。operator==
用于比较两个对象是否相等,而 qHash
函数用于计算对象的哈希值。
假设我们有一个自定义对象 Person
:
#include <QSet>
#include <QString>
#include <QDebug>
class Person {
public:
Person(const QString &name, int age) : m_name(name), m_age(age) {}
QString name() const { return m_name; }
int age() const { return m_age; }
bool operator==(const Person &other) const {
return m_name == other.m_name && m_age == other.m_age;
}
private:
QString m_name;
int m_age;
};
Q_DECLARE_METATYPE(Person)
uint qHash(const Person &person, uint seed) {
seed ^= qHash(person.name(), seed);
seed ^= qHash(person.age(), seed);
return seed;
}
int main() {
QSet<Person> people;
people.insert(Person("Alice", 30));
people.insert(Person("Bob", 25));
for (const Person &person : people) {
qDebug() << person.name() << person.age();
}
return 0;
}
QSet
保证存储的元素是唯一的,避免了重复数据的问题。QSet
会根据元素的哈希值自动排序,便于遍历。QSet
可以存储基本数据类型(如整数、字符串等)以及自定义对象。自定义对象需要重载 operator==
和 qHash
函数。
QSet
适用于需要存储唯一元素且需要高效查找的场景,例如:
QSet
原因:自定义对象未重载 operator==
和 qHash
函数。
解决方法:确保自定义对象重载了 operator==
和 qHash
函数,如示例代码所示。
QSet
中的元素顺序不符合预期原因:QSet
根据元素的哈希值自动排序,顺序可能不符合预期。
解决方法:如果需要保持插入顺序,可以考虑使用 QVector
或 QList
,并在插入时手动去重。
希望这些信息对你有所帮助!
领取专属 10元无门槛券
手把手带您无忧上云