【Qt-容器类】

Qt编程指南

  • [■ 顺序容器类](#■ 顺序容器类)
    • [■ QList](#■ QList)
    • [■ QVector](#■ QVector)
    • [■ QLinkedList](#■ QLinkedList)
    • [■ QStack](#■ QStack)
    • [■ QQueue](#■ QQueue)
  • [■ 关联容器类](#■ 关联容器类)
    • [■ QSet](#■ QSet)
    • [■ QMap](#■ QMap)
    • [■ QMultiMap](#■ QMultiMap)
    • [■ QHash](#■ QHash)
    • [■ QMultiHash](#■ QMultiHash)

■ 顺序容器类

■ QList

c 复制代码
QList 比较常用的容器类,以数组列表的形式实现,在前、后添加数据非常快。以下为常用方法。
QList<QString> list;

插入:insert()          //list.insert(2, "mm");         // 在位置2插入项目     list << "aa" << "bb" << "cc"; // 插入项目
删除:removeAt(i)  //i 是下标
删除第3个  QString str =  list.takeAt(2); // 从列表中删除第3个项目,并获取它
替换:replace()       //替换第3个元素     list.replace(2, "bc");   
交换:   swap()          // list.swap(1,3);     // 交换项目1和项目3
移动:move()
添加:append()       // list.append("dd");            // 在列表尾部添加
头部添加: prepend("mm")          list.prepend("mm");           // 在列表头部添加
包含:  list.contains("mm");      //列表中是否包含"mm"
列表包含某值个数:  list.count("mm");  包含"mm"的个数 
查找 : list.indexOf("mm");     // 第一个"mm"的位置,默认从位置0开始往前查找 ,返回第一个匹配的项目的位置
往前查找: list.indexOf("mm", 2); // 第二个"mm"的位置,我们指定从位置1开始往前查找

QList<QString> list;
list << "A" << "B" << "C" << "B" << "A";
list.indexOf("B"); // returns 1
list.indexOf("B", 1); // returns 1
list.indexOf("B", 2); // returns 3
list.indexOf("X"); // returns -1
bool QList::empty()  const表为空,则返回true 
list.begin(), list.end()
for(int i=0; i<list.size(); ++i)
{
       qDebug() << list.at(i);   
}

QList<int> z;
z <<1<<2<<3<<4;          // z对应的值z[0] = 1;z[1] = 2;z[2] = 3;z[3] = 4;

QList<int> z;
z <<1<<2<<3<<4;
z.removeAt(1);           //删除下标为1后,z对应的值z[0] = 1;z[1] = 3;z[2] = 4;


#include <QCoreApplication>
#include <QList>
#include <QDebug>
 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
     QList<QString> list;
     list << "aa" << "bb" << "cc"; // 插入项目
     if(list[1] == "bb") list[1] = "ab";
    list.replace(2, "bc");        // 将"cc"换为"bc"
    qDebug() << "the list is: ";  // 输出整个列表
    for(int i=0; i<list.size(); ++i){
        qDebug() << list.at(i);   // 现在列表为aa ab bc
    }
    list.append("dd");            // 在列表尾部添加
    list.prepend("mm");           // 在列表头部添加
    QString str = list.takeAt(2); // 从列表中删除第3个项目,并获取它
    qDebug() << "at(2) item is: " << str;
    qDebug() << "the list is: ";
    for(int i=0; i<list.size(); ++i)
    {
        qDebug() << list.at(i);   // 现在列表为mm aa bc dd
    }
    list.insert(2, "mm");         // 在位置2插入项目
    list.swap(1,3);               // 交换项目1和项目3
    qDebug() << "the list is: ";
    for(int i=0; i<list.size(); ++i)
    {
        qDebug() << list.at(i);   // 现在列表为mm bc mm aa dd
    }
    qDebug() << "contains 'mm' ?" << list.contains("mm"); // 列表中是否包含"mm"
    qDebug() << "the 'mm' count: " << list.count("mm"); // 包含"mm"的个数
    // 第一个"mm"的位置,默认从位置0开始往前查找,返回第一个匹配的项目的位置
    qDebug() << "the first 'mm' index: " << list.indexOf("mm");
    // 第二个"mm"的位置,我们指定从位置1开始往前查找
    qDebug() << "the second 'mm' index: " << list.indexOf("mm", 1);
    return a.exec();
}

■ QVector

c 复制代码
append函数或者<<操作符来在数组最后端添加元素而不用担心溢出问题。
定义 QVector <int>  array(10) ;                 array[5]=4;
加元素 strArray.append("Hello"); //可以这样       
加元素 strArray<<"World!"; //也可以这样   
插入:    strArray.insert(1,"这就是在hello和world之间添加");
删除:    strArray.remove(1); //删除第一个元素,从0开始    strArray.remove(1,3); //从1开始,删除3个元素
复制(取代):    strArray.replace(1,"LEO"); //删除第一个元素,从0开始
是否含有contains()函数是用来查找向量容器内是否含有某个对象。
count()函数可以找出某个对象出现的次数。
resize()函数可以在任何时候改变QVector向量容器的体积
capacity()函数会告诉你向量容器所占内存的实际大小空间。
判断是否包含某元素  qDebug()<< Array.contains(12);

末端添加元素:
QVector<int> Array;
Array<<3;   //第一种方式
Array.append(5);  //第二种方式

种方式
QVector<int>::iterator num;
for (num=Array.begin(); num!=Array.end(); num++)
{
    qDebug()<< *num;
}

//第二种方式
for (int i=0; i<Array.count(); i++)
{
     qDebug()<< Array[i];
}

QVector<QString> strArray; 

■ QLinkedList

c 复制代码
是链式列表,数据项不是连续的内存存储,基于迭代器访问数据项,插入和删除数据项操作时间相同
QLinkedList<QString> list;
list<<"1"<<"2"<<"3"<<"4";
// foreach正序:
QString str;
foreach (str, list)
    qDebug() << str;
    
// 迭代器正序
QLinkedList<QString>::iterator it;
for(it = list.begin(); it != list.end(); ++it){
    qDebug() << *it;
}

// 迭代器倒序
QLinkedList<QString>::const_iterator it = list.constEnd();
while (it != list.constBegin())
{
    --it;
    qDebug()<<*it;
}
移除某个节点
list.removeOne("4");

列表大小
list.size()
链头位置插入
list.push_front("5");


链尾位置插入
list.push_back("5");
清空
list.clear();

■ QStack

c 复制代码
类似于堆栈,后入先出的特点,push()和pop()用于数据进出栈。
QStack <int> s;                        //定义一个int型栈
s. isEmpty();                           //返回栈是否为空
s.size();                                //返回当前栈中元素的个数  
s.push();                                //在栈顶上堆进一个元素
s.pop();                                 //删除掉栈顶上的元素,并返回这个元素
s.top();                                //返回栈顶的元素,并不会删除  
T &  operator[] ( int i );            //以数组形式访问队列元素

QStack<int> stack;
stack.push(1);   
stack.push(2);
stack.push(3);
 
while(!stack.isEmpty())
    stack.pop();

■ QQueue

c 复制代码
它的父类是QList,是个模板类 
类似于队列,先入先出的特点,enqueue()和dequeue()用于操作数据进出队列。
QQueue<int> Q;              //定义一个int型队列
Q.isEmpty();                 //返回队列是否为空
Q.size();                    //返回队列元素个数
Q.clear();                   //清空队列
Q.enqueue();                 //在队列尾部添加一个元素, 比如插入数字5: Q.enqueue(5)
Q.dequeue();                 //删除当前队列第一个元素,并返回这个元素
Q.head();                    //返回当前队列第一个元素
Q.last();                    //返回当前队列尾部的元素
T &  operator[]( int i );    //以数组形式访问队列元素

QQueue<int> queue;
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
 
while(!queue.isEmpty())
    queue.dequeue();

■ 关联容器类

■ QSet

c 复制代码
基于散列表的集合模板类,存储数据的顺序不定,查找速度非常快。
QSet类是一个模板类,他是一个哈希表集合。QSet<T>是Qt的一个普通容器类。QSet存储的值是不指明顺序的,QSet对这些值提供了快速检索的功能。他和QHash很像PS:Set就是键值一样的Hash
QSet<QString> set;
set.insert("one");
set.insert("three");
set << "twelve" << "fifteen" << "nineteen";

使用contains()判断set中是否存在某一项:
if (!set.contains("ninety-nine"))

遍历整个set
QSetIterator<QWidget *> i(set);
while (i.hasNext())
qDebug() << i.next();

QSet<QWidget *>::const_iterator i = set.constBegin();
  while (i != set.constEnd()) {
      qDebug() << *i;
      ++i;
  }

QSet<QString> set;
foreach (const QString &value, set)
qDebug() << value;

#include <QtCore/QCoreApplication>
#include <QSet>
#include <QDebug>
 
class Data{ 
public: 
    Data(const QString &strVal, const int &intVal){ 
        StrVal = strVal;
        IntVal = intVal;
    } 
    QString StrVal;
    int IntVal; 
    friend QDebug operator << (QDebug os, Data data){
 
        os << "(" << data.StrVal << " ,"
           << data.IntVal << ")"; 
        return os;
    }
}; 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QSet<Data*> dataSet;
    dataSet.insert(new Data("ABC", 0));
    dataSet.insert(new Data("DEF", 1));
    dataSet << new Data("AAA", 2);
    dataSet << new Data("CCC", 3);
 
    //Java style
    QSetIterator<Data *> i(dataSet);
    while(i.hasNext())
        qDebug() << *(i.next());
 
    //STL style
    QSet<Data*>::const_iterator stlI = dataSet.constBegin();
    while(stlI != dataSet.constEnd()){
        
        qDebug() << **stlI;
        delete *stlI;
        stlI++;
    } 
    return a.exec();
}

■ QMap

c 复制代码
QMap存储数据按照键的顺序来存储的,一个键映射一个值。

QMap<int,int> map;
map[1] = 1;
map[2] = 2;
map[3] = 3;
//或者使用insert
QMap<int,int> map;
map.insert(1,1);
map.insert(2,2);
map.insert(3,3);

int num = map[1]; //或者 int num2 = map.value[2];

■ QMultiMap

c 复制代码
是QMap的子类,一个键可以对应多个值。
QMultiMap<int,int> map;
map.insert(1,1);
map.insert(1,2);
//map.size() == 2 

■ QHash

c 复制代码
基于散列表来实现的,查找速度非常快。
和QMap比较
QHash查找速度更快
QMap是按键顺序排序的,QHash数据项任意排序

创建,键值对的方式插入,数据类型随意,这里以键int,值QString示例。
QHash<int,QString> qhash;

//方式一
qhash[1] = "1";
qhash[2] = "2";
qhash[3] = "3";

//方式二
qhash.insert(4, "4");
通常,QHash 每个键只允许有一个值。如果用已经存在的键调用 insert(),先前的值将被删除 
qhash.insert(4,"10);
最后键为4的值将变成"10"。

取值;
//方式一   
QString str1=qhash.value(1);//str1="1";

//方式二
QString str2=qhash[2];//str1="2";

如果qhash里面没有该键值,则返回默认构造值;比如:QString str3=qhash.value(5);//str3="";

检索某个值是否在里面
if(qhash.contains(9))
{
    return false;
}

if(qhash.contains(1))
{
    return true;
}

查找某个字并获取,一般推荐contains结合value重载函数来实现,

QString str;
if(qhash.contains(1))
{
    str=qhash.value(1);      
}
else
{
    str=qhash.value(1,"wert");
    //如果哈希表中不存在指定键的元素,该函数使用第2个参数作为默认值
}


QHash<int,QString>::const_iterator it = qhash.constBegin();
while (it != qhash.constEnd()) {
    cout << it.key() << ": " << it.value() << Qt::endl;
    ++i;
}
当然不用const_iterator也可以,直接iterator;

删除,下面两种都可以
qhash.erase(it);//这里的it是迭代器哦
qhash.remove(key);

■ QMultiHash

c 复制代码
QMultiHash是QHash的子类,用于处理多值映射的类,与QMultiMap类似。
相关推荐
艾莉丝努力练剑11 分钟前
深入详解C语言的循环结构:while循环、do-while循环、for循环,结合实例,讲透C语言的循环结构
c语言·开发语言·c++·学习
晨非辰1 小时前
#C语言——学习攻略:自定义类型路线--结构体--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段
c语言·开发语言·经验分享·学习·其他·学习方法·visual studio
赵英英俊2 小时前
Python day43
开发语言·python
Warren982 小时前
公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
java·开发语言·前端·javascript·vue.js·python·安全
·白小白2 小时前
【数据结构】——栈(Stack)的原理与实现
c语言·开发语言·数据结构
野犬寒鸦3 小时前
Java Stream API 中常用方法复习及项目实战示例
java·服务器·开发语言·数据库
提笔惊蚂蚁3 小时前
Python 高级语法
开发语言·python
q567315234 小时前
使用reqwest+select实现简单网页爬虫
开发语言·爬虫·golang·kotlin
郝学胜-神的一滴4 小时前
C++中的`auto`与`std::any`:功能、区别与选择建议
开发语言·c++·程序人生·算法
Rain_is_bad5 小时前
初识c语言————排序方法
c语言·开发语言·数据结构