基于模板的容器类,更轻量,安全且容易使用,速度消耗和内联方面进行了优化
存储在Qt容器中的数据必须是可赋值的数据类型
Qt的QObject及其他的子类(QWidget,Qdialog)是不能够存储在容器中的,没有复制构造函数和赋值操作符
正确:QList<QToolBar*>list;
错误:QList<QToolBar>list;
Qt的容器类是可以嵌套的
QHash<QString,QList<double> >
后面的两个> >之间必须要有空格哦,否则就当成>>了
常用容器类
QList<T>
存储给定数据类型T的一列数值
列表追加,列表中间插入操作的函数
维护了一个指针数组,该数组存储的指针指向QList的列表项的内容,因此其提供了基于下表的快速访问
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QList<QString> list;//声明了一个栈对象
QString str("This is a test string");
list<<str;//通过操作运算符<<将一个QString字符串存储在该列表中
qDebug()<<list[0]<<"How are you!";
w.show();
return a.exec();
}
QLinkedList<T>
链式列表,以非连续的内存块保存数据
不能使用下标,只能使用迭代器访问他的数据项,在很大的列表进行插入操作时,能有更高的效率
QVector<T>
既可以使用下标,也可以使用迭代器访问数据项,继承的子类有QPolygon,QPolygonF和QStack
向后遍历的例子
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QList<int> list;//创建了一个空的列表
list<<1<<2<<3<<4<<5;//通过操作运算符<<将5个整数输入
QListIterator<int> i(list);//以该list为参数初始化一个QListIterator对象i
for(;i.hasNext();)//调用QListIterator<T>::hasNext()函数检查当前迭代点之后是否有列表项
qDebug()<<i.next();//调用QListIterator<T>::next()函数进行遍历
w.show();
return a.exec();
}向前遍历用的函数
QMutableListIterator<T>读写迭代器,insert(),remove()
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QList<int> list;//创建了一个空的列表
// list<<1<<2<<3<<4<<5;//通过操作运算符<<将5个整数输入
QMutableListIterator<int> i(list);//以该list为参数初始化一个QListIterator对象i
for(int j=0;j<10;j++)
i.insert(j);
for(i.toFront();i.hasNext();)
qDebug()<<i.next();
for(i.toBack();i.hasPrevious();)
{
if(i.previous()%2==0)
i.remove();
else
i.setValue(i.peekNext()*10);
}
for(i.toFront();i.hasNext();)
qDebug()<<i.next();
w.show();
return a.exec();
}
STL风格迭代器
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
QList<int> list;//创建了一个空的列表
for(int j=0;j<10;j++)
list.insert(list.end(),j);
QList<int>::iterator i;
for(i=list.begin();i!=list.end();++i)
{
qDebug()<<(*i);
*i=(*i)*10;
}
QList<int>::const_iterator ci;
for(ci = list.constBegin();ci!=list.constEnd();++ci)
qDebug()<<*ci;
w.show();
return a.exec();
}