Qt容器类的分类:
1.连续容器:QVector,QLinkedList,QList
2.关联容器:QMap,QHash,键值对
一、连续容器:
1.QVector是一种与数组相似的数据结构,它可以把项存储到内存中相邻近的位置。
与数组的区别在于:可以随时改变大小
优缺点:向向量的末尾添加新的元素是非常快速的,但是在向量的前面或者中间添加新元素是非
常耗时的。
2.QLinkedList:把项存储到内存中不相邻位置的数据结构。这是一种链表结构。
优缺点:不能提供快速随即访问,但是提供了常量时间的插入与删除。
访问时不支持索引访问,需要用到迭代器。
3.QList:数组列表,结合了QVector和QLinkedList的最重要优点,支持快速随机访问,访问时是基于索引的。并且对含有1000项以
上的列表来说,在中间插入也是很快的。
4.迭代器访问QList
QList<double> list;
QListIterator<double> i(list);
while(i.hasNext())
{
doSomething(i.next());
}
或者:由后向前访问
QList<double> list;
QListIterator<double> i(list);
i.toBack();
while(i.hasPrevious())
{
doSomething(i.previous());
}
Mutable 迭代器,在遍历时提供了插入、修改以及删除项的函数。
QMutableListIterator<double> i(list);
while(i.hasNext)
{
if(i.next()<0.0)
i.remove();
}
修改:
int val = i.next();
if(val<0)
i.setValue(-val);
采用begin 和 end 方式访问:
QList<double>::iterator i= list.begin();
while(i!=list.end())
{
*i=qAbs(*i);
++i;
}
二、关联容器:
1.QMap 是一个升序键顺序存储键值对的数据结构,可以提供良好的查找和插入性能以及键序的迭代。
1) 插入的方式:
QMap<QString,int> map;
map.insert("aaa",1);
map.insert("bbb",2);
map["ccc"] = 3;
*:[ ]操作符即可以作为插入时来使用,也可以用来访问数据元素。
2) 访问数据元素:
用[]操作符
用value,比如:
int val = map.value("aaa");
2.QHash是一个在Hash表中存储键值对的数据结构。提供了比QMap更快的查找功能。
三、容器的一些通用算法:
1.qFind:在容器类中线性查找一个特定的值。例如:
QStringList list;
list<<"Emma"<<"Karl"<<"James"<<"Mary"<<"Arme"
QStringList::iterator i = qFind(list.begin(),list.end(),"Karl");
QStringList::iterator j = qFind(list.begin(),list.end(),"Tom");
上面的例子: i 返回 list.begin()+1;
j 返回 list.end();
2.qBinaryFind:在升序的顺序存储结构中,执行二分查找搜索。
3.qFill :采用一个特定的值来组装容器
QLinkedList<int> list(10);
qFill(list.begin(),list.end(),10);
4.qCopy:将一个容器类的值赋值到另一个容器
QVector<int> vect(list.count());
qCopy(list.begin(),list.end(),vect.begin());
同一个容器内copy,列表内的前两项,覆盖后两项
qCopy(list.begin(),list.begin()+2,list.end-2);
5.qSort:以升序排列列表中的项:
qSort(list.begin(),list.end());
6.qDeleteAll 对每一个存储在容器类中的指针调用delete。调用后这些指针成了悬浮指针,所以需要调用clear()。
qDeleteAll(list);
list.clear();
7.qSwap 交换两个变量的值:
四、字符串、字节数组和变量
QString,QByteArray 和QVariant
1.QString:支持16位Unicode,是QChar的向量,QString可以嵌入“\0”字符,length()函数返回包括被嵌入的“\0”字符的整个字符
串的大小。
1) QString 的连接操作:
A. 使用“+” 和“+=”直接连接
B. 使用append()方法连接
C. 使用sprintf函数:
例子:
str.sprintf("%s %.1f%%","perfet completion",100.0);
D.使用arg
例子:
QString str = QString("%1 %2 (%3s-%4s)").arg("deng").arg("sujun").arg(1980).arg(2080);
得到的结构如下:deng sujun 1980s-2080s
2) 字符串与其它类型的转换
QString::number(double),数字转字符串
str.toInt,toLongLong,toDouble,字符串转数字
3)截取字符串的操作:mid,left,right
4) 查找是否包含某个字符串:indexOf();
5) 是否以某个开始或者结束用:startWith() 和endWith();
6) 比较用"==",区分大小写
7) 替换:replace()
8) 删除首尾出现的空格:trimmed()
9) 把中间出现的多个空格,制表符,回车换成简单的一个空格,用str.simplified()
10) 把一个字符串分成一个QStringList字串,用split();
例子:
QString str = "deng su jun";
QStringList list = str.split(" ");
11) 把QStringList中的元素连成一个简单的字符串,用join,参数为连接的符号:
例子:
//使用上面的list
QString str = list.join(" ");// str 的结构为:deng su jun
12) 字符串的判空用:isEmpty()
13)QString与const char* 转换:
str.toAscii() 或者 toLatin1(),将QString转换成了QByteArray;
再调用QByteArray的data或者constData,可以转换成const char* 类型
2.QByteArray:存储原始的二进制数据以及8位编码的文本数据非常有用。
自动保存的最后一项总是"\0";
编程接口与QString类似,有mid,left,right,trimmed,toLower,toUpper,simplified等函数。
3.QVariant:用来处理那些能够支持不同数据类型的变量。
例子:
QMap<int,QVariant> map;
map.insert(1,2);
map.insert(2,"deng");
map.insert(3,3.4);
map.insert(4,true);
创建这样的数据结构是非常吸引人的,但是QVariant的便利性是以牺牲效率和可读性为代价的。
2.关联容器:QMap,QHash,键值对
一、连续容器:
1.QVector是一种与数组相似的数据结构,它可以把项存储到内存中相邻近的位置。
2.QLinkedList:把项存储到内存中不相邻位置的数据结构。这是一种链表结构。
3.QList:数组列表,结合了QVector和QLinkedList的最重要优点,支持快速随机访问,访问时是基于索引的。并且对含有1000项以
上的列表来说,在中间插入也是很快的。
4.迭代器访问QList
或者:由后向前访问
QList<double> list;
QListIterator<double> i(list);
i.toBack();
while(i.hasPrevious())
{
}
Mutable 迭代器,在遍历时提供了插入、修改以及删除项的函数。
QMutableListIterator<double> i(list);
while(i.hasNext)
{
}
修改:
采用begin 和 end 方式访问:
QList<double>::iterator i= list.begin();
while(i!=list.end())
{
}
二、关联容器:
1.QMap 是一个升序键顺序存储键值对的数据结构,可以提供良好的查找和插入性能以及键序的迭代。
1) 插入的方式:
2) 访问数据元素:
2.QHash是一个在Hash表中存储键值对的数据结构。提供了比QMap更快的查找功能。
三、容器的一些通用算法:
1.qFind:在容器类中线性查找一个特定的值。例如:
QStringList list;
list<<"Emma"<<"Karl"<<"James"<<"Mary"<<"Arme"
QStringList::iterator i = qFind(list.begin(),list.end(),"Karl");
QStringList::iterator j = qFind(list.begin(),list.end(),"Tom");
上面的例子: i 返回 list.begin()+1;
2.qBinaryFind:在升序的顺序存储结构中,执行二分查找搜索。
3.qFill :采用一个特定的值来组装容器
4.qCopy:将一个容器类的值赋值到另一个容器
同一个容器内copy,列表内的前两项,覆盖后两项
5.qSort:以升序排列列表中的项:
6.qDeleteAll 对每一个存储在容器类中的指针调用delete。调用后这些指针成了悬浮指针,所以需要调用clear()。
7.qSwap 交换两个变量的值:
四、字符串、字节数组和变量
QString,QByteArray 和QVariant
1.QString:支持16位Unicode,是QChar的向量,QString可以嵌入“\0”字符,length()函数返回包括被嵌入的“\0”字符的整个字符
串的大小。
1) QString 的连接操作:
例子:
str.sprintf("%s %.1f%%","perfet completion",100.0);
例子:
QString str = QString("%1 %2 (%3s-%4s)").arg("deng").arg("sujun").arg(1980).arg(2080);
得到的结构如下:deng sujun 1980s-2080s
2) 字符串与其它类型的转换
3)截取字符串的操作:mid,left,right
4) 查找是否包含某个字符串:indexOf();
5) 是否以某个开始或者结束用:startWith() 和endWith();
6) 比较用"==",区分大小写
7) 替换:replace()
8) 删除首尾出现的空格:trimmed()
9) 把中间出现的多个空格,制表符,回车换成简单的一个空格,用str.simplified()
10) 把一个字符串分成一个QStringList字串,用split();
例子:
QString str = "deng su jun";
QStringList list = str.split(" ");
11) 把QStringList中的元素连成一个简单的字符串,用join,参数为连接的符号:
例子:
QString str = list.join(" ");// str 的结构为:deng su jun
12) 字符串的判空用:isEmpty()
13)QString与const char* 转换:
2.QByteArray:存储原始的二进制数据以及8位编码的文本数据非常有用。
3.QVariant:用来处理那些能够支持不同数据类型的变量。
例子:
QMap<int,QVariant> map;
map.insert(1,2);
map.insert(2,"deng");
map.insert(3,3.4);
map.insert(4,true);
创建这样的数据结构是非常吸引人的,但是QVariant的便利性是以牺牲效率和可读性为代价的。