这个和C++的容器大致相同,就不详细分析了。
顺序容器:
QList <T> | 最常用的容器(双端数组),可以根据索引访问,QStringList==QList<QString> |
QLinkedList<T> | 和QList相比,QLinkedList 可以使用迭代器 |
QVector<T> | 内存相邻位置存储,且给定类型的值的数组(单端数组) |
QStack<T> | 栈 |
QQueue<T> | 队列 |
QSet<T> | 提供一个可以快速查询单值的数学集 |
关联容器:使用键对的方式存储<key,data>
QMap<key,T> | 关联容器,使用键的顺来存储数据, |
QMultiMap<key,T> | 是QMap的一个便捷类,一个键可以关联多个值 |
QHash<key,T> | 和QMap相似,QHash的数据是以任意的顺序存储的,查找速度快 |
QMulitHash<key,T> | QHash的一个便捷类,提供了实现多值散列的接口函数 |
容器添加数据的方式:
以QList为例
使用 << 添加数据
QList<int>list;
list<<123<<234<<345;//添加3个数据
for(int i=0;i<10;i++)//添加
{
list<<i;
}
for(auto i:list)//C++11遍历(通用)
{
qDebug()<<i;
}
使用迭代器遍历容器:
- iterator 正常迭代器
- const_iterator 只读迭代器
QList<int>::iterator it;
for(it=list.begin();it!=list.end();it++)
{
qDebug()<<*it;
}
foreach关键词
遍历顺序容器:
QList<int>list1;
list1<<10<<20<<30;
foreach(int i,list1)
{
qDebug()<<i;
}
遍历关联容器:
有序容器:
QMap<int,int>map;
map.insert(10,20);
map.insert(100,30);
map.insert(1000,40);
foreach(int i,map.keys())//获取全部键值
{
qDebug()<<map.value(i);
}
无序容器:
QMultiMap<QString,int>mmap;
mmap.insert("10",20);
mmap.insert("10",30);
mmap.insert("10",40);
QList<QString>keys=mmap.uniqueKeys();//获取所有的键
foreach(QString s,keys)//遍历所有的键
{
foreach(int i,mmap.values(s))//遍历键中所有的值
{
qDebug()<<i;
}
}
常用算法:
头文件:#include<QtAlgorithms>
qBinaryFind | 二进制查找 |
qCopy | 复制 |
qCopyBackward | 向后复制 |
qEqual | 相等 |
qFill | 填充 |
qFind | 查找 |
qCount | 计数 |
qSort | 排序 |
qStableSort | 稳定排序 |
qLowerBound | 下限 |
qUpperBound | 上限 |
qLess | 小于 |
qGreater | 大于 |
在头文件:#include<QtGlobal>中含有一些其他的常用的函数
- qMax() 两数最大值
- qMin() 两数最大值
- qBound() 边界
- qrand() qsrand() 随机数
- 等函数
QString(字符串)
隐式共享:
隐式共享又称写时复制,一个共享类由指向一个共享数据块的指针和数据组成,共享数据块中包含一个引用计数。引用计数在对象被创建时为1,当有新对象引用数据时,引用计数会+1,当引用计数为0时,自动销毁数据。(智能指针)
深复制和浅复制:
- 浅复制:复制一个引用
- 深复制:需要消耗内存和资源
共享的好处:程序不需要进行不必要的数据复制,可以减少数据复制,使用更少的内存,对象可以很容易地被分配,或者作为参数被传递 ,或者从函数被返回。
常见的隐式共享类有:
QButeArray、QCursor、QFont、QPixmap、QString、QUrl、QVariant、所有容器类等
QString常用的函数:
[ ] | 下标访问 |
append() | 末尾添加数据 |
replace() | 替换 |
insert() | 插入 |
+ | 拼接 |
trimmed() | 去除两端空白字符 |
simplified() | 除去两端和中间多余的空白字符 |
split() | 拆分字符 |
isEmpty() | 判空 |
right() | 右侧字符 |
left() | 左侧字符 |
mid() | 取区间的数据 |
indexOf() | 获取索引 |
at() | 获取索引的位置 |
count() | 统计个数 |
startWith() | 是否为开始 |
endsWith() | 是否为结尾 |
contains() | 是否包含 |
字符的转换
toInt() | 字符串转整数 |
QString::number() | 整数转字符串 |
toFloat() | 字符串转浮点数 |
toUpper() | 转大写 |
toLower(0 | 转小写 |
arg()函数的常见使用方法:
根据%x x的取值范围为(1~99),根据编号来替换字符。
QString s1="123";
QString s2="456";
QString s3="789";
QString S=QString("%1 %2 %3").arg(s1).arg(s2).arg(s3);//用s1替换%1,用s2替换%2,用s3替换%3
qDebug()<<S;
注意 :
.arg(s1).arg(s2).arg(s3) %的编号从小到大取
QString s1="123";
QString s2="456";
QString s3="789";
QString S=QString("%5 %1 %6").arg(s1).arg(s2).arg(s3);//用s1替换%1,用s2替换%2,用s3替换%3
qDebug()<<S;
arg的重载:
arg(qlonglonga,int fieldWidth= 0,intbase= 10,QCharfillChar= QLatin1Char(' '))
- a代表数据
- fieldWidth指定填充并用字符填充字符填充的最小空间量。正值生成右对齐的文本;负值将生成左对齐的文本。
- base 是进制数
1.进制的转换
int s1=123;
int s2=456;
int s3=789;
QString S=QString("%1 %2 %3").arg(s1).arg(s2).arg(s3);
QString S1=QString("%1 %2 %3").arg(s1,0,8).arg(s2,0,2).arg(s3,0,16);
//用s1替换%1使用8进制,用s2替换%2使用2进制,用s3替换%3使用16进制
qDebug()<<S;
qDebug()<<S1;
2.对齐的方式
- 正数代表右对齐
- 负数代表左对齐
QString S=QString("%1 %L2 %L3").arg(s1).arg(s2).arg(s3);
QString S1=QString("%1").arg(s1,-5);//左对齐
QString S2=QString("%1").arg(s2,5);//右对齐
QString S3=QString("%1").arg(s3,10);//右对齐
qDebug()<<S;
qDebug()<<S1;
qDebug()<<S2;
qDebug()<<S3;
double类型可以根据指定的格式和精度设置格式
arg(doublea,int fieldWidth= 0,charformat= 'g',intprecision= -1,QCharfillChar= QLatin1Char(' '))
- a代表数据
- fieldWidth代表对齐方式
- format 类型
- precision 精度(小数点后的位数)
format的格式有:
double b1=12.222;
double b2=13.333;
double b3=14.444;
QString s=QString("%1 %2 %3").arg(b1,0,'E',3).arg(b2,0,'g',3).arg(b3,0,'f',3);
qDebug()<<s;
QByteArrary(字节数组)
和QString类似,但QBytearray没有arg(),QByteArrary总会保证以'\0'结尾
QVariant(共用体) (union)
一个QVariant对象一个时间只会保存单一类型的单一值。
可以使用toT(T为数据类型)进行转换。
- canConvert() 可以判断一个类型是否可以转换为一个特殊类型
- convent() 判断一个类型是否可以转换为不同类型