QT容器分类与QSet应用

一.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。例如,在一个游戏中,可能需要跟踪玩家已经访问过的关卡,以确保他们不会重复访问。

  • 21
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI+程序员在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值