一.QT容器分类
Qt提供了多种容器类,大致可以分为以下几类:
1.顺序容器:这类容器按照线性顺序(如列表或数组)存储元素。例如,QList, QLinkedList, QVector, QStack, 和 QQueue。
2.关联容器:这类容器允许你存储自定义的键值对。例如,QMap 和 QHash。
3.容器迭代器:用于遍历容器中的元素。Qt提供了Java类型的迭代器和STL类型的迭代器。
4.其他容器:还有一些其他类型的容器,如QSet,用于存储唯一元素的集合。
二.容器介绍
1.顺序容器和关联容器在前面文章已有详细介绍,不在赘述。
2.容器迭代器:
(1)Java风格的迭代器:
QSetIterator: 这是一个只读迭代器,用于遍历QSet中的元素。
QSet<int> set;
// 假设set已经被填充了一些数据...
QSetIterator<int> it(set);
while (it.hasNext()) {
int value = it.next();
qDebug()<<value;
}
(2)STL风格的迭代器
QSet::const_iterator: 这是一个const迭代器,用于只读遍历集合中的元素。
const QSet<int> set;
// 假设set已经被填充了一些数据...
for (QSet<int>::const_iterator it = set.constBegin(); it != set.constEnd(); ++it) {
int value = *it;
qDebug()<<value;
}
三.QSet介绍
QSet<T> 是 Qt 的通用容器类之一。 它以未指定的顺序存储值并提供非常快速的值查找。
QSet的API大部分和QList相同。这里仅列举QSet独有的成员函数。
1、QSet<T> & intersect(const QSet<T> &other)
QSet<T> & operator&=(const QSet<T> &other)
从当前集合中删除other集合中未包含的所有项目。返回当前集合的引用。
QSet<int> set1{1,2,3,4,5};
QSet<int> set2{4,5};
set1.intersect(set2);
qDebug()<<set1;// QSet(4, 5)
2、bool intersects(const QSet<T> &other)
如果此集合至少有一项与 other 的项相同,则返回 true。(是否相交)
3、QSet<T> & subtract(const QSet<T> &other)
从当前集合中删除包含在other集合中的所有项目。返回当前集合的引用。
QSet<int> set1{1,2,3,4,5};
QSet<int> set2{4,5};
set1.subtract(set2);
qDebug()<<set1;// QSet(1, 2, 3)
4、QSet<T> & unite(const QSet<T> &other)
other 集合合并到当前集合。 返回当前集合的引用。
QSet<int> set1{1,2,3,4,5};
QSet<int> set2{4,5,6,7};
set1.unite(set2);
qDebug()<<set1;//QSet(3, 1, 5, 6, 7, 2, 4)
5、QSet<T> operator&(const QSet<T> &other)
返回新的集合。取交集。
QSet<int> set1{1,2,3,4,5};
QSet<int> set2{4,5,6,7};
qDebug()<<(set1 & set2);//QSet(4, 5)
6、QSet<T> & operator&=(const T &value)
QSet<int> set1{1,2,3,4,5};
set1 &= 4;
qDebug()<<set1;//QSet(4)
7、QSet<T> operator-(const QSet<T> &other)
返回一个新的 QSet,它是当前集合和 other 集合的集合差。
QSet<int> set1{1,2,3,4,5};
QSet<int> set2{4,5,6,7};
qDebug()<<(set1 - set2);// QSet(1, 2, 3)
8、QSet<T> & operator-=(const QSet<T> &other)
等同于 subtract(other)。
9、QSet<T> & operator-=(const T &value)
减去集合中的一项
QSet<int> set1{1,2,3,4,5};
qDebug()<<(set1 -= 3);// QSet(5, 2, 1, 4)
10. // 输出成QList
QList<QString> listStrs = set.toList();
qDebug()<< "输出成QList :" << listStrs;
11.常规操作
QSet<QString> set;
set.insert("212");
// 重置大小
set.reserve(10);
// 输出容量
qDebug()<< "容量 :" << set.capacity();
// 输出内容
qDebug()<< "输出内容 :" << set;
// 是否包含
set.contains("121") //true 包含
// 输出实际大小
qDebug()<< "实际大小:" << set.size();
// 输出内容
qDebug() << "输出内容 :" << set;
// 是否是空
qDebug()<< "是否为空 :" << set.isEmpty();
// 移除某值
set.remove("121");
// 输出所有元素
qDebug()<< "输出元素 :" << set.values();
// 清除
set.clear();
四.使用场景
1.消除重复项:
如果有一个包含重复项的列表或数组,并且想要消除重复项,可以使用QSet。QSet会自动删除重复的元素,只保留唯一的元素。
2.快速查找:
QSet提供了高效的插入、查找和删除操作。如果需要频繁地查找元素是否存在于一个集合中,QSet是一个很好的选择。它的查找操作的时间复杂度接近于O(1),因此非常快速。
3.集合运算:QSet支持常见的集合运算,如并集、交集和差集。可以使用QSet来执行这些操作,对两个集合进行合并、比较或找出它们的共同元素。
4.存储唯一标识符:
在某些情况下,可能需要存储一组唯一标识符,例如数据库中的唯一ID或网络中的唯一连接。QSet可以方便地存储这些标识符,并确保每个标识符只出现一次。
5.跟踪状态:
如果需要跟踪一组对象的状态,并确保每个状态只出现一次,可以使用QSet。例如,在一个游戏中,可能需要跟踪玩家已经访问过的关卡,以确保他们不会重复访问。