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;
  }

 

posted @ 2012-12-29 02:19  justwake  阅读(1848)  评论(0编辑  收藏  举报