Qt文档阅读笔记-QSet官方解析及实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq78442761/article/details/86242033

目录

 

官方解析

博主栗子


官方解析

QSet类是一个模板类,他是一个哈希表集合。
QSet<T>是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能。他和QHash很像
PS:Set就是键值一样的Hash

这里举一个QSet中存储QString的栗子:

QSet<QString> set;

使用insert()函数往set里面添加值:

  set.insert("one");
  set.insert("three");
  set.insert("seven");

或者通过<<这个重载运算符放set插入数据:

set << "twelve" << "fifteen" << "nineteen";

使用contains()判断set中是否存在某一项:

  if (!set.contains("ninety-nine"))
      ...

如果想遍历整个set,可以使用iterator。QSet提供了2种方式去遍历,一种是java风格的iterators(使用QSetIterator和QMutableSetIterator)或者使用STL风格的iterators(QSet::iterator和QSet::const_iterator)。下面举了一个使用java风格的iterator去变量QSet<QWidget*>:
 

  QSetIterator<QWidget *> i(set);
  while (i.hasNext())
      qDebug() << i.next();

对于同样的代码,可以使用STL风格的iterator;

  QSet<QWidget *>::const_iterator i = set.constBegin();
  while (i != set.constEnd()) {
      qDebug() << *i;
      ++i;
  }

QSet是无序的,所以iterator的指向也是未知的,如果需要有序的键值,那么得使用QMap。
遍历QSet,还可以使用foreach:

  QSet<QString> set;
  ...
  foreach (const QString &value, set)
      qDebug() << value;

使用remove()函数可以删除某个item。使用clear()移除所有的item。
QSet的数据必须是一个可转化的数据类型(assignable data type),举个例子,不能存QWidget而要存QWidget*。除此之外,这些类型要提供 == 的重载,并且还得有一个全局的qHash()函数,这个全局的qHash()函数为键值的类型返回一个hash值。通过QHash的文档将会列出上面所说到的东西。
QSet使用hash表进行检索。因为hash表增加和收缩,不浪费内存的特性,使得QSet能快速检索,如果你大概知道这个hash表的大小,可以使用reserve()函数可以通知QSet中hash表的大小,但是这不是获取良好性能的必要条件,通过调用capacity()去查看hash表的大小。

博主栗子

举一个插入和遍历,看大小的例子把

源码如下:

#include <QtCore/QCoreApplication>
#include <QSet>
#include <QDebug>

class Data{

public:

	Data(const QString &strVal, const int &intVal){

		StrVal = strVal;
		IntVal = intVal;
	}
	

	QString StrVal;
	int IntVal;

	friend QDebug operator << (QDebug os, Data data){

		os << "(" << data.StrVal << " ,"
		   << data.IntVal << ")";

		return os;
	}
};

int main(int argc, char *argv[])
{
	QCoreApplication a(argc, argv);

	QSet<Data*> dataSet;
	dataSet.insert(new Data("ABC", 0));
	dataSet.insert(new Data("DEF", 1));
	dataSet << new Data("AAA", 2);
	dataSet << new Data("CCC", 3);

	//Java style
	QSetIterator<Data *> i(dataSet);
	while(i.hasNext())
		qDebug() << *(i.next());

	//STL style
	QSet<Data*>::const_iterator stlI = dataSet.constBegin();
	while(stlI != dataSet.constEnd()){
		
		qDebug() << **stlI;
		delete *stlI;
		stlI++;
	}

	return a.exec();
}

运行截图如下:

当在此处下断点时,运行截图如下:

当在此处下断点时,运行截图如下:

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/86242033