Qt-连续容器及迭代器
一、连续容器
1.连续容器->向量QVector<T>
向量连续容器是把项存储到内存中相邻的位置的数据结构。
与C++数组的区别在于,向量连续容器知道自己的大小并且可以被重新定义大小。
在向量的末尾添加额外的项非常迅速,而在向量的中间插入项是比较费时的。
eg.. QVector<double> vect(3); 赋值方式: 一.vect[0]=1.0;vect[1]=0.54;vect[2]=-0.146; 二.vect.append(1.0);vect.append(0.54);vect.append(-0.146); 三.vect<<1.0<<0.54<<-0.146; eg..遍历操作(使用count和[]操作符) double sum=0.0; for(int i = 0;i<vect.count();i++) sum+=vect[i];
2.连续容器->链表QlinkedList<T>
把数据存储到内存中不相邻的位置的数据结构。
链表并未提供[]操作符。所以必须使用迭代器来遍历项。
迭代器还可以用来指定项的位置。
eg.. QLinkedList<QString> list; list.append("Clash"); list.append("Ramons"); QLinkedList<QString>::iterator i = list.find("Ramons"); list.insert(i,"inserts");
3.连续容器->列表QList<T>
QList是一个数组列表,结合了单一类中QVector<T>和QLinkedList<T>的最重要的有点。
支持随机访问,且基于索引。在QList<T>的任意一段插入或者删除项都是非常迅速的。
并且对含1000项以上的列表来说,在中间插入项也是很快的。
子类: QStringList----QList<QString>
QStack<T> 堆栈
QQueue<T> 队列
二、迭代器
1.JAVA类型迭代器:
只读迭代器:
QVectorIterator<T> QLinkedListIterator<T> QListIterator<T>
读写迭代器
QMutableVectorIterator<T> ...
eg.. QList<double> list; ... QListIterator<double> i(list); while(i.hasNext()) dosomething(i.next());
2.STL类型迭代器
C<T>::iterator
C<T>::const_iterator
STL风格的迭代器的语法是模仿C++数组的指针。我们可以使用++和--操作符来
移动下一项或者前一项。而使用*操作符来获取当前项。
eg.. QList<double> list; QList<double>::iterator i = list.begin(); while(i != list.end()) { *i=qAbs(*i); i++; }
注意:如果想使用STL风格的迭代器遍历某个函数的返回值,则必须复制此容器,
并且遍历这个副本。
eg..正确方式: QList<int> list = splitter->sizes(); QList<int>::const_iterator i = list.begin(); while(i != list.end()) { dosomething(*i); i++; } eg..错误方式: QList<int>::const_iterator i = splitter->sizes().begin(); while(i != splitter->sizes().end()) { ... }
这是因为每次调用QSplitter::sizes()都返回一个新的QList<int>值。
三、遍历容器
Qt还提供了最后一种在连续容器中遍历项的方式-foreach循环。break和continue声明是支持的。
QLinkedList<Movie> list; ... foreach(Movie mov,list) { if(mov.title() == "abc") ... break; }