QT中的 容器(container)

只要是数据就必须使用容器,程序中容器中的数据更方便增删改查
Qt中提供了一组通用的基于模板的容器类(container class)。可以用来存储指定的项目(items),如QVector(QString),与STL(C++标准模板库)相比,Qt中的容器更轻量,更安全,耿荣翻译使用

遍历容器

  • 要遍历存储在容器中的项,可以使用两种类型的迭代器之一:java风格的迭代器和stl风格的迭代器。java风格的迭代器更容易使用并提供高级功能,而STL风格的迭代器稍微更高效,可以与Qt和STL的通用算法一起使用。
  • Qt还提供了一个foreach关键字,使遍历容器中存储的所有项变得非常容易

Qt中的容器

  • Qt提供了以下顺序容器:QList、QLinkedList、QVector、QStack和QQueue。对于大多数应用程序,QList是最好的类型。虽然它是作为数组列表实现的,但是它提供了非常快的前置和附加。如果你真的需要一个链表,使用QLinkedList;如果您希望您的项目占用连续的内存位置,请使用QVector。QStack和QQueue是提供LIFO和FIFO语义的便利类。
  • Qt还提供了这些关联容器:QMap、QMultiMap、QHash、QMultiHash和QSet。“多”容器方便地支持与单个键相关联的多个值。“哈希”容器通过使用哈希函数而不是对排序集进行二进制搜索,从而提供更快的查找。
  • 作为特殊情况,QCache和QContiguousCache类在有限的缓存存储中提供了对象的高效散列查找。

JAVA风格的遍历器

QT中的 容器(container)_第1张图片

STL风格

QT中的 容器(container)_第2张图片

STL风格的迭代器兼容Qt和STL点的通用算法,对于每个容器都有只读或者 可读可写两个类型,一般来说只读迭代器比可读可写的迭代器更快,所以尽量使用只读的迭代器

STL迭代器的API是以数组中的指针为模型的。例如,++操作符将迭代器向前推进到下一个项目,*操作符返回迭代器指向的项目。
注意:STL风格的迭代器指向项目中的,其中容器的begin()函数返回的是指向该容器的第一个项目的迭代器,end()函数返回的也是一个迭代器,但是时最后一个项目的写一个项目的虚假项目,end()表示的是一个无效的位置
当列表为空时,begin()函数等价于end();

2.1 QList

    QListlist;
    list<<"hello"<<"my"<<"life";
    QList::iterator i; //定义一个读写迭代器
    for(i=list.begin();i::ConstIterator j;//只读迭代器
    for(j=list.constBegin();j!=list.constEnd();++j)
    {
        qDebug()<<*j;
    }

结果:

QT中的 容器(container)_第3张图片
QT中的 容器(container)_第4张图片

QList模板提供了一个列表,实际上是一个指针数组,当项目数小于1000时,可以实现快速的插入删除操作
关于list的一些其他的操作
    list.size();//获取大小
    list.insert(3,"ll");
    list.replace(3,"me");
    list.removeAt(3);//移除操作
    list.move(2,1);
    list.swap(2,3);//交换
    list.append("sda");
    list.prepend("ssad");
    list.removeFirst();
    list.removeLast();
    list.takeAt(2);//从项目中删除该项并且获得该项的值
    list.takeFirst();
    list.takeLast();
    list.indexOf("e",3);//获取一个项目的索引
    list.contains("sa");//是否包含相应的项目
    list.count("ss");//出现的次数
    list可以用"<<"来向插入值,也可以用 []来进行索引访问,下标从0开始,对于只读可以用at()函数

2.2 QLinkedList

基于迭代器访问的 List,方便快速插入,删除

  foreach (var, container) {
  }
  
    QLinkedListlist;
    list<<1<<2<<4;
    foreach (int i, list) {
      qDebug()<

2.3 QVector

QVector又叫可变向量,可变数组

2.4 QMap和QHash

QMap类是一个模板类,它提供了一个基于红黑树的字典。
QMap是Qt的通用容器类之一。它存储(键、值)对并提供与键关联的值的快速查找。
QMap和QHash提供了非常类似的功能。的差异是:

  • QHash比QMap提供平均更快的查找。(详见算法复杂度)
  • 当迭代QHash时,这些项是任意排序的。在QMap中,项目总是按键排序。
  • QHash的key类型必须提供operator==()和全局QHash (key)函数。QMap的键类型必须提供operator<()来指定总订单。
  • 如果要检查映射是否包含某个键,请使用contains():
QMap接口
  • insert()
  • value()//获取的值不存在则返回0
  • contains()
  • remove()
  • take()
  • clear()
  • insertMulti()
  • 可以直接使用[]来插入一个键值对或者键的值
  • QMap默认是一个键对应一个值,也可以用insertMulti()进行一键多值的插入,对于此种情况,使用QMap的子类QMutiMap更方便
     QMapmap;//QMap是按照键来有序存放的
     map["one"]=1;
     map["two"]=2;
     map["three"]=3;
     map.insert("seven",7);
     //获取键值的时候,使用“[]”操作符时,如果map中没有该键,会自动插入该键值对
     int value=map["six"];
     qDebug()<::const_iterator it;
     for(it=map.constBegin();it!=map.constEnd();++it)
     {
         qDebug()<<*it;
     } 
----------------------------------------
     QMap::const_iterator it=map.begin();
     while(it!=map.end())
     {
       std::cout<<*it;
       ++it;
     }

QT中的 容器(container)_第5张图片

QHash

Qmap和QHash的差别

  • QHash比QMap提供平均更快的查找。(详见算法复杂度)
  • 当迭代QHash时,这些项是任意排序的。在QMap中,项目总是按键排序。
  • QHash的key类型必须提供operator==()和全局QHash (key)函数。QMap的键类型必须提供operator<()来指定总订单。
    QHashem;
    em.insert(1,"Bob");
    em.insert(2,"mary");
    foreach (int i, em.keys()) {
        qDebug()<::const_iterator it;
    for (it = em.begin(); it != em.end(); ++it)
        qDebug() << it.key() << ": " << it.value();
    
注意在容器使用嵌套的时候要在 > >打空格,不然会当做 输入流对待

3、常用算法

在头文件中,Qt提供了一些全局的模板函数,这些函数可以使用在容器中的常用算法,我们可以在任何提供了STL风格的迭代器的容器类中使用这些算法,包括QList、 QLinkedList、QVector、QMap、QHash.

3.1 qsort()

//利用map的原理来进行排序
    QStringList list;
    list << "AlPha" << "beTA" << "gamma" << "DELTA";
    
    QMap map;
    foreach (const QString &str, list)
        map.insert(str.toLower(), str);
    list = map.values();
    qDebug() < list;
    list << 33 << 12 << 68 << 6 << 12;
    qSort(list.begin(), list.end(), qGreater());

3.2 qcopy

     QStringList list;
     list<<"a"<<"b"<<"c";
     QVectorvect(3);
     QVectorvect2(8);
     qCopy(list.begin(),list.end(),vect.begin());
     qCopy(list.begin(),list.end(),vect2.begin()+3);
     foreach (QString item, vect) {
        qDebug()<

QT中的 容器(container)_第6张图片

3.3 qFill //填充函数

    QVectorvect(5);
    qFill(vect.begin()+1,vect.end()-2,"PUBG");
    foreach (QString item, vect) {
       qDebug()<

QT中的 容器(container)_第7张图片

3.4 qFind

-------------在QList中的使用-------------
    QListlist;
    list<<1<<2<<5<<25;
    QList::const_iterator i=qFind(list.begin(),list.end(),25);
    if(i !=list.end())
    {
        qDebug()<<"找得到了";
    }
    else
    {
        qDebug()<<"没找到";
    }
---------------在QMap中的使用-------------
    QMapem;
    em.insert("c++","bob");
    em.insert("win32","xiaqi");
    em.insert("mfc","xiaolan");
    em["linux"]="laowang";
    QMap::iterator i=em.find("linux");
    //在map中find只能find其key 不能是value
    while(i!=em.end()&&i.key()=="linux")
    {
        qDebug()<

QT中的 容器(container)_第8张图片

你可能感兴趣的:(Qt)