Qt 常用数据模板类记录

一、QList <T>
概念:是一个提供列表的通用容器类,储存一系列的值,并且提供基于索引的数据访问方法和快速插入、删除操作。
基于索引的API比QLinkedList基于迭代器更方便。
prepend和append操作速度很快,因为QList在其数组的两端预先分配了内存
对于大量的插入和添加,选择Qvector,QVector在堆上分配内存。
除了isEmpty以外成员函数不验证输入的有效性,提高效率。
插入:void QList::append(const QList<T>&value) 在链表末尾插入value
实际上调用了operator += (const QList<T> &other)
删除:bool QList::removeOne ( const T & value )
对于非const,操作符[]返回的是该元素的引用,返回值可以用作左操作数
当T的类型为指针的时候,需要调用qDeleteAll释放内存
QList<Por_test *> slist;
qDeleteAll(slist);//释放内存 相当于delete操作符delete所有指针
slist.clear();//删除项

std::list
是一种顺序容器,允许在其中的任何位置进行插入和删除操作,可以双向迭代。
list容器的实现是双向链表,双向链表可以在不同不相关的位置进行存储元素,其关联顺序由一个指向前面元素的链接和指向后面元素的链接来保持。

二、QLinkedList
概念:是一个提供链接列表的容器类
是一个真正的链表,保证在中间插入数据时时间复杂度是常量,因为他的储存空间不是连续的,使用迭代器来储存元素。
例如:QLinkedList<QString>::iteratori = list.find(“abc”);

三、QVector
概念:是一个提供动态数组的模板类,容器的元素在相邻的内存
QVector <int> array(10);可以调用他的封装接口操作这个数组
使用append不用担心溢出,count可以获得大小

四、QMap
概念:提供了一个基于跳跃列表的字典
//函数:
insert(); //插入元素(推荐使用)。参数:1.key 2.value
value(); //通过Key值v获得value,不存在返回0
take(); //删除一个key,并获得这个key对应的值
clear(); //清除所有元素
contains(); //判断对应的key值是否存在,返回:布尔值
①常见操作
使用[]去取一个key对应的值时,如果这个key不存在,则返回0、NULL...等(依据类型而定),并添加这个key值
QMap<QString,int> map;
map["one"] = 1;
int value1 = map["two"];
qDebug()<< value1; //返回0,two已经添加进map中
②遍历元素
通过迭代器、foreach
QMap<QString,int> map;
QMap<QString,int>::const_iterator ite;
map.insert("one",1);
map.insert("two",2);
for(ite=map.constBegin();ite!=map.constEnd();++ite)
{
qDebug()<<ite.key()<<ite.value();
}

foreach (QString item, map.keys()) //通过遍历keys列表
{
qDebug()<<item<<map[item];
}
或者用QMap迭代器
QMapIterator<QString,QString> i(map)
while(i.hasNext())
doSomething(i.next());

五、QHash
概念:一个模板类,它提供基于哈希表的字典,与QMap基本一致,但更高效
QMap与QHash的差别:
1、QHash具有比QMap更快的查找速度
2、QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据

六、QQueue
是Qlist的子类,也是一个模板类;这个类实现一种先进先出的数据结构,在上传服务器消息时很好用
QQueue<QString> q;
q.enqueue(); //在队列尾部添加一个元素,比如q.enqueue("string");
q.dequeue(); //删除当前队列第一个元素,并返回这个元素
q.head(); //返回当前队列第一个元素
q.last(); //返回当前队列尾部的元素

 

容器常用算法
一、qSort
排序,默认为升序,第二个参数:qGreater<T>()逆序
QList<int> list;
list << 36 << 16 << 66 << 6 << 56;
qSort(list.begin(), list.end()); //升序
qSort(list.begin(), list.end(),qGreater<int>()); //逆序
二、qCopy
拷贝,要注意有足够的空间存储拷贝内容
QStringList list;
list << "a" << "b" << "c";
QVector<QString> vect(5);
qCopy(list.begin(), list.end(), vect.begin()+1);
foreach (QString item, vect)
{
qDebug() << item;
}
//vect:["","a","b","c",""]
三、查找(qFind、find)
QList查找,qFinf

 

posted @ 2020-03-24 21:01  蓦然而然  阅读(916)  评论(0编辑  收藏  举报