Qt文档阅读笔记-QSet官方解析及实例
目录 官方解析博主栗子官方解析QSet类是一个模板类,他是一个哈希表集合。QSet<T>是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能。他和QHash很像PS:Set就是键值一样的Hash这里举一个QSet中存储QString的栗子:QSet<QString> set;使用insert()...
目录
官方解析
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();
}
运行截图如下:
当在此处下断点时,运行截图如下:
当在此处下断点时,运行截图如下:
更多推荐
所有评论(0)