容器Set使用和查找的效率比较

无论是STL还是QT中都是使用不同的数据结构,其中常用的有vector、map、list、set等,今天要说的极是set。

set作为一个容器可以保存多种类型的数据,而且里面的每一个元素都是唯一的,并且可以根据元素自行排序,这使得它在查找元素的时候效率很高。

一、 插入元素
和QVector比较

void testCountSet() {
	QSet<QString> strSet;
	strSet.insert("aaa");
	strSet.insert("aaa");
	strSet.insert("aaa");
	strSet.insert("aaa");
	strSet.insert("aaa");
	strSet.insert("aaa");

	qDebug() << QStringLiteral("数据集的数量:") << strSet.size();

	QVector<QString> strVector;
	strVector.push_back("bbb");
	strVector.push_back("bbb");
	strVector.push_back("bbb");
	strVector.push_back("bbb");
	strVector.push_back("bbb");
	strVector.push_back("bbb");
	qDebug() << QStringLiteral("数据向量的数量:") << strVector.size();
}

输出结果:
在这里插入图片描述
可以看出Set中存储的元素数据是唯一的,不重复的。Vector中存储的数据是可以重复的。

二、查找效率
和Map、Vector比较

void testFindTime() {
	//数据集
	QSet<QString> strSet;
	for (int i = 0; i < 1000000; i++) {
		strSet.insert(QString::number(i));
	}
	QTime time;
	time.start();

	strSet.find("999990");
	qDebug() << QStringLiteral("Set查找:") << time.elapsed() << "ms";

	//数据向量
	QVector<QString> strVector;
	for (int i = 0; i < 1000000; i++) {
		strVector.push_back(QString::number(i));
	}

	QTime time2;
	time2.start();
	qFind(strVector.begin(), strVector.end(), "999990");
	qDebug() << QStringLiteral("Vector查找:") << time2.elapsed() << "ms";

	//映射结构
	QMap<QString, QString> mapStr;
	for (int i = 0; i < 1000000; i++) {
		mapStr.insert(QString::number(i), QString::number(i));
	}
	QTime time3;
	time3.start();
	mapStr.find("999990");
	qDebug() << QStringLiteral("Map查找:") << time3.elapsed() << "ms";
}

输出结果:
在这里插入图片描述
可以看出Set和Map的查找效率明显要比Vector要高很多。因为Set和Map在存储数据的时候进行了排序,其实就是对二叉树进行了封装,再进一步就是对平衡二叉树(红黑树)进行了封装,所以在查找效率上有了很大的提升。

三、stl中的map和Qt中的QMap比较

Qt中的QMap

	QSet<int> intSet;
	intSet.insert(21);
	intSet.insert(2);
	intSet.insert(51);
	intSet.insert(11);
	intSet.insert(26);
	intSet.insert(121);
	intSet.insert(0);
	intSet.insert(1);

	QSet<int>::Iterator it;
	for (it = intSet.begin();it!=intSet.end();it++){
		qDebug() << *it;
	}

输出结果:
在这里插入图片描述
STL中的set

	std::set<int> intSet;
	intSet.insert(21);
	intSet.insert(2);
	intSet.insert(51);
	intSet.insert(11);
	intSet.insert(26);
	intSet.insert(121);
	intSet.insert(0);
	intSet.insert(1);

	std::set<int>::iterator it;
	for (it = intSet.begin(); it != intSet.end(); it++) {
		qDebug() << *it;
	}

输出结果:
在这里插入图片描述
通过以上两个代码示例可以看出:stl中的set在插入数据元素的时候,对数据元素进行了排序!而QT中的QSet并没有进行显示的排序。

aaa

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wb175208

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

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

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

打赏作者

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

抵扣说明:

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

余额充值