Qt数据结构详解

这篇具有很好参考价值的文章主要介绍了Qt数据结构详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常用数据类型

qint8 quint8 qint16 quint16 qint32 quint32 qint64 quint64 qreal …

  • 文档索引
    qt 数据结构,Qt-基础,qt,数据结构,开发语言,c++,ui
类型 说明 大小
qint8 signed char 1
quint8 unsigned char 1
qint16 signed short 2
quint16 unsigned short 2
qint32 signed int 4
quint32 unsigned int 4
qint64 long long int 8
quint64 unsigned long long int 8
qreal double 8
  • 求绝对值: T qAbs(const T &t)
qreal absoluteVale;
qreal myValue = -5.78;
absoluteValue = qAbs(myValue);
  • 最大值与最小值

T &qMax(const T &value1, const T &value2)
T &qMin(const T &value1, const T &value2)

 int myValue - 6;
 int yourValue = 4;
 int minValue = qMin(myValue,yourValue);
  • 取中间值

const T &qBound(const T &min, const T &value, const T &max)

qint32 v_1 = 10;
qint32 v_2 = 20;
qint32 v_3 = 30;
qin32 boundeValue = qBound(v_1,v_2,v_3);
// boundedValue == 20
  • 比较浮点数大小

bool qFuzzyCompare(float p1, float p2)
bool qFuzzyCompare(double p1, double p2)

  • 随机数种子

void qsrand(uint seed);
Thread-safe version of the standard C++ srand() function

  • 生成随机数

int qrand();

  • 获取环境变量
QByteArray env = qgetenv("Path");
std::cout<< env.consData();
qDebug() << QString::fromLocal8Bit(env);

QSize QSizeF

QSize(int width, int height)
QSizeF(qreal width, qreal height)

QSize size(100,10);
size.rheight() += 5;
// result:(100,15)
QSize size(100,10);
size.reidth() += 20;
// result:(120,10)
QSize s(3,7);
QSize r(-1,4);
s -=r;
// result :(4,3)

QPoint QPointF

QPoint(int xpos, int ypos);
QPointF(qreal xpos, qreal ypos);

QPoint p(1, 2);
p.rx()--; 
// result:(0,2)
QPoint p(1, 2);
p.ry()++; 
// result:(1,3)
QPoint p(-1, 4);
p *= 2.5; 
// result:(-2,10)
QPoint p( 3, 7);
QPoint q(-1, 4);
p += q; 
// result :(2,11)

QRect

QRect(const QPoint &topLeft, const QPoint &bottomRight)
QRect(const QPoint &topLeft, const QSize &size)
QRect(int x, int y, int width, int height)

QRect r1(100, 200, 11, 16);
QRect r2(QPoint(100, 200), QSize(11, 16));

qt 数据结构,Qt-基础,qt,数据结构,开发语言,c++,ui

QString: Qt字符串操作

QString类提供了一个Unicode字符字符串。
QString(const QChar unicode, int size = -1)
QString(QChar ch)
QString(int size, QChar ch)
QString(QLatin1String str)
QString(const QString &other)
QString(QString &&other)
QString(const char str)
QString(const QByteArray &ba)

初始化
QString str = "OO";
// QString 使用 fromUtf8() 函数将 const char * 数据转换为 Unicode
追加
QString str = "IO";
str.prepend("this "); // 从前面追加
str.append("pram"); // 尾椎
// 也可以使用push_back、push_front
替换
QString x = "S";
QString y = "VC";
x.replace(0,0,y);
删除
// 按位删除
QString s = "Funck";
s.remove(1,3);

// 删除特定字符
QString t = "Ali Baba";
t.remove(QChar('a'),Qt::CaseInsensitive); // 不区分大小写

QString x = "Ali Baba";
x.remove(QChar('a'));  //Qt::CaseSensitive (default)区分大小写

QString str = "do you what to see!";
str.remove("11");

QString 插入
QString str = "fuck A";
str.insert(5, "BC");
判断为Empty | Null
QString.isEmpty();       // true
QString("").isEmpty();   // true
QString("X").isEmpty();  // false
QString("abc").isEmpty();// false

QString().isNull();     // true
QString("").isNull();   // false
QString("acb").isNull();//false
查找字符串出现的位置

int QString::indexOf(const QString &str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive)const
返回第一次搜索到指定字符串的位置,从from开始搜索。

QString x = "stl emistl";
QString y = "stl";
x.indexOf(y); 		// 0:找到了第一个stl
x.indexOf(y,1);		// 7:找到了第二个stl
x.indexOf(y,7);		
x.indexOf(y,8);		// -1:没有找到对应的子串
查找字符串出现的次数
QString x = "A Sticky Question";
QString y   "sti";
x.count(y,Qt::CaseInsensitive); // 返回2 不区分大小写
x.count(y);						// 返回1
查找是否包含另一字符串
QString x = "Peter Pan";
x.contains("Peter",Qt::CaseInsensitive);// true(不区分大小写)
x.contains("peter");//false(默认区分大小写)
字符串截取
  • 向左截取
QString x = "coding is fun";
QString y = x.left(6); // y == "coding"
  • 向右截取
QString x = "coding is fun";
QString y = x.right(6); // y == "is fun" 
  • mid截取
QString x = "coding is fun";
QString y = x.mid(5, 4); // y == "g is" 从index=5开始截取,截取4个
QString z = x.mid(5); // z == "g is fun" 从index=5开始截取,截取到末尾
数字转QString

静态方法::[static] QString QString::number(uint n, int base = 10)

  • 默认十进制
qint32 num = 65534;
QString str = QString::number(num);
  • 十六进制
qint32 num = 65534;
QString str = QString::number(num,16); // fffe
  • 大写十六进制
qint32 num = 65534;
QString str = QString::number(num); // fffe
  • 浮点数
// 默认情况 6位
qreal num = 3.141592658;
QString str = String::num(num);// 3.14159

// 如果对精度有要求
qreal num_2 = 3.141592658;
QString str_2 = QString::num(num,'g',8);// 3.1415927
格式化输入

QString arg(const QString &a, int fieldWidth = 0, QChar fillChar = QLatin1Char( ’ ’ )) const

int age = 18;
QString name = "xaiomin";

// name 代替%1 age代替%2
QString str = QString("name is %1, age is %2").arg(name).arg(age);

qreal value = 123.456;
// 设置小数点后两位
str= QString("Number %1").arg(value,0,'f',2); // Number 123.45
与std::string互相转换
  • QString转std::string
QString qstr = "yiou";
std::string str = qstr.toStdString();
  • std::string 转QString
std::string str = "yoiu";
QString qstr = QString::fromStdString(str);

QByteArray

提供一个字节数组(序列),QByteArray可用于存储原始字节(包括“\ 0” )和传统的8位 “\ 0” 端接字符串 . 使用QByteArray比使用const char 更方便.
在IO操作中,c语言常使用const char ,而Qt中常使用QByteArray

初始化和访问
  • 批量初始化
QByteArray ba("Hello");
  • 按字节初始化 &访问
QByteArray ba;
ba.resize(5);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
ba[3] = 0x33;
ba[4] = 0x34;

// 也可以使用at访问
QByteArray qArray;
qArray.resize(5);
qArray[0] = 0x30;
qArray[1] = 0x31;
qArray[2] = 0x32;
qArray[3] = 0x33;
qArray[4] = 0x34;
qDebug()<<qArray.at(3);
QByteArray 与char*相互转换
  • QByteArray转换成char*
QByteArray ba("Hello");
const char* str = ba.constData();
std::cout<<str<<std::endl;
  • char* 转换成QByteArray
// 第一种:通过QString的字符集转换
const char* p = "abc";
QString q = QString(p);
QByteArray ba = q.toUtf8();
qDebug()<<ba;

// 第二种:通过RawData(原始数据)
// const char hello[] = {'h', 'e', 'l', 'l', 'o'};
const char* hello = "hello";
QByteArray ba(QByteArray::fromRawData(hello,5))
关于\0的理解
QByteArray ba("hel\0l\0o",5);
std::cout << ba.size() <<std::endl; // 5
std::cout << ba.constData() << std::endl; // 遇到\0终止

QVariant

QVariant变量是没有数据类型的。 QVariant类像是最常见的Qt的数据类型的一个共用体(union),一个QVariant对象在一个时间只保存一个单一类型的一个单一的值(有些类型可能是多值的,比如字符串列表)。
可以使用toT()(T代表一种数据类型)函数来将QVariant对象转换为T类型,并且获取它的值。这里toT()函数会复制以前的QVariant对象,然后对其进行转换,所以以前的QVariant对象并不会改变。

容器

只要是数据就必须要使用容器,程序中的数据放在容器中方便增删改查。
Qt库提供了一组通用的基于模板的容器类(container classes)。这些容器类可以用来存储指定类型的项目(items),例如,如果大家需要一个QString类型的可变大小的数组,那么可以使用QVector(QString)。与STL(Standard Template Library,C++的标准模板库)中的容器类相比,Qt中的这些容器类更轻量,更安全,更容易使用。
qt 数据结构,Qt-基础,qt,数据结构,开发语言,c++,ui

容器 只读遍历器 读写遍历器
QList,QQueue QList::const_iterator QList::iterator
QLinkedList QLinkedList::const_iterator QLinkedList::iterator
QVector,QStack QVector::const_iterator QVector::iterator
QSet QSet::const_iterator QSet::iterator
QMap<Key, T>,QMultiMap<Key, T> QMap<Key, T>::const_iterator QMap<Key, T>::iterator
QHash<Key, T>,QMultiHash<Key, T> QHash<Key, T>::const_iterator QHash<Key, T>::iterator

STL风格迭代器兼容Qt和STL的通用算法(generic algorithms),而且在速度上进行了优化。对于每一个容器类,都有两个STL风格迭代器类型:一个提供了只读访问,另一个提供了读写访问。因为只读迭代器比读写迭代器要快很多,所以应尽可能使用只读迭代器
STL风格迭代器的API模仿了数组的指针,例如,使用“++”操作符来向后移动迭代器使其指向下一个项目;使用“*”操作符返回迭代器指向的项目等。需要说明的是,不同于Java风格迭代器,STL风格迭代器是直接指向项目的。其中一个容器的begin()函数返回了一个指向该容器中第一个项目的迭代器,end()函数也返回一个迭代器,但是这个迭代器指向该容器的最后一个项目的下一个假想的虚项目,end()标志着一个无效的位置,当列表为空时,begin()函数等价于end()函数。

QList

QList是一个模板类,它提供了一个列表。QList实际上是一个T类型项目的指针数组,所以它支持基于索引的访问,而且当项目的数目小于1000时,可以实现在列表中间进行快速的插入操作。QList提供了很多方便的接口函数来操作列表中的项目,例如:
插入操作insert();替换操作replace();移除操作removeAt();移动操作move();
交换操作swap();在表尾添加项目append();在表头添加项目prepend();
移除第一个项目removeFirst();移除最后一个项目removeLast()

从列表中移除一项并获取这个项目takeAt(),还有相应的takeFirst()和takeLast();
获取一个项目的索引indexOf();
判断是否含有相应的项目contains();
获取一个项目出现的次数count()。
对于QList,可以使用“<<”操作符来向列表中插入项目,也可以使用“[ ]”操作符通过索引来访问一个项目,其中项目是从0开始编号的。不过,对于只读的访问,另一种方法是使用at()函数,它比“[ ]”操作符要快很多。

void fun(){
    QList<int> qList;
    for (int i =0; i < 10; i++){
        qList.append(i); // 追加
    }
    qList.prepend(99);
    
    // for循环遍历
    for ( int i =0; i < qList.size(); i++){
        qDebug()<<qList.at(i);
        qDebug()<<qList[i];
    }
    
    // foreach
    foreach(int item, qList){
        qDebug()<<item;
    }
    
    // java风格迭代器 只读迭代器
    QListIterator<int> it(qList);
    while (it.hasNext()){
        qDebug()<< it.next();
    }
    
    // java风格迭代器 读写迭代器
    QMutableListIterator<int> mit(qList);
    while (mit.hasNext()) {
        if(mit.next() == 8){
            mit.setValue(888);
        }
    }
    
    // STL风格迭代器 只读迭代器
    QList<int>::const_iterator itm;
    for(itm = qList.constBegin(); itm != qList.constEnd(); itm++){
        qDebug()<<*itm;
    }
    
    // STL风格迭代器 读写迭代器
    QList<int>::iterator itm2;
    for(itm2 = qList.begin(); itm2 != qList.end(); itm2++){
        qDebug()<<*itm2;
        *itm2 = (*itm2)*9;
    }
    
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QList<QString> strList;
    QList<int> intList;

    strList.append("fuck");
    strList.append("a");
    strList.append("japan");
    strList.append("girl");

    intList << 6 << 8 << 9 << 9;

    QString str = strList.at(3);
    qDebug()<<strList.at(0) << " "
            <<strList.at(1) << " "
            <<strList.at(2) << " "
            <<strList.at(3) << " ";

    QList<QString>::const_iterator j;
    for (j = strList.constBegin(); j != strList.constEnd(); ++j)
    {
        qDebug() << *j;
    }
    return a.exec();
}
  QList<QString> list;
    list << "A" << "B" << "C" << "D";
    QList<QString>::iterator i; // 使用读写迭代器
    qDebug()<< "the forward is :";
    for(i = list.begin();i != list.end();i++){
        // 使用QString的toLower函数转换为小写
        *i = (*i).toLower();
        qDebug()<<*i;
    }

    qDebug()<<"the backward is :";
    while(i != list.begin()){
        // 到序遍历
        --i;
        qDebug()<<*i;
    }

    QList<QString>::const_iterator j; // 使用只读迭代器
    qDebug()<<"the foeward is :";
     for(j = list.constBegin(); j!= list.constEnd();j++){
         qDebug()<<*j;
     }

qt 数据结构,Qt-基础,qt,数据结构,开发语言,c++,ui

QLinkedList

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

QLinkedList<int> list;
list << 1 << 2 << 3;
foreach(int i, list){
	qDebug() << i;
}

QVector

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

QMap

QMap类是一个容器类,它提供了一个基于跳跃列表的字典(a skip-list-based dictionary)。QMap是Qt的通用容器类之一,它存储(键,值)对并提供了与键相关的值的快速查找。QMap中提供了很多方便的接口函数,例如:
插入操作insert();
获取值value();
是否包含一个键contains();
删除一个键remove();
删除一个键并获取该键对应的值take();
清空操作clear();
插入一键多值insertMulti()。

可以使用“[ ]”操作符插入一个键值对或者获取一个键的值,不过当使用该操作符获取一个不存在的键的值时,会默认向map中插入该键,为了避免这个情况,可以使用value()函数来获取键的值。当使用value()函数时,如果指定的键不存在,那么默认会返回0,可以在使用该函数时提供参数来更改这个默认返回的值。QMap默认是一个键对应一个值的,但是也可以使用insertMulti()进行一键多值的插入,对于一键多值的情况,更方便的是使用QMap的子类QMultiMap。

void mapFun(){
    QMap<QString, int>map;
    map["one"] = 1; // 向map中插入("one",1)
    map["three"] = 3;
    map.insert("seven",7); // 使用insert()函数进行插入
    // 获取键的值,使用“[ ]”操作符时,如果map中没有该键,那么会自动插入
    int value1 = map["six"];
    qDebug() << "value1:" << value1;
    qDebug() << "contains 'six' ?" << map.contains("six");
    // 使用value()函数获取键的值,这样当键不存在时不会自动插入
    int value2 = map.value("five");
    qDebug() << "value2:" << value2;
    qDebug() << "contains 'five' ?" << map.contains("five");
    // 当键不存在时,value()默认返回0,这里可以设定该值,比如这里设置为9
    int value3 = map.value("nine",9);
    qDebug() << "value3:" << value3;
    
    // STL风格
    QList<int>::const_iterator itm;
    QMap<int,QString> Employees;
    Employees.insert(1,"Bob");
    Employees.insert(2,"Chad");
    Employees.insert(3,"Mary");
    Employees.insert(4,"oldWang");
    Employees[5] = "Danny"; //不推荐这样赋值
    QMap<int, QString>::const_iterator i = Employees.constBegin();
    while (i != Employees.constEnd()) {
        std::cout << i.key() << ": " << i.value().toStdString() << std::endl;
        ++i;
    }
    QMap<int, QString>::iterator i = Employees.begin();
    while (i != Employees.end()) {
        if(i.value() == "oldWang")        {
            i.value() = "robort";
        }
        ++i;
    }
}

QHash

QMap与QHash的差别:

  • QHash具有比QMap更快的查找速度
  • QHash以任意的顺序存储数据项,而QMap总是按照键Key顺序存储数据
  • QHash的键类型Key必须提供operator==()和一个全局的qHash(Key)函数,而QMap的键类型Key必须提供operator<()函数。
void hashFun(){
    QHash<int,QString> Employees;    
    Employees.insert(1,"Bob");    
    Employees.insert(2,"Chad");    
    Employees.insert(3,"Mary");    
    foreach(int i, Employees.keys())    
    {        
        qDebug() << Employees[i];   
    }    
    QHashIterator<int,QString> Iter(Employees); 
    while(Iter.hasNext())   
    {       
        Iter.next();   
        qDebug() << Iter.key() << " = " << Iter.value(); 
    }
}

注意:容器也可以嵌套使用,例如QMap<QString,QList >,这里键的类型是QString,而值的类型是QList,需要注意,在后面的“> >”符号之间要有一个空格,不然编译器会将它当做“>>”操作符对待。文章来源地址https://www.toymoban.com/news/detail-762934.html

到了这里,关于Qt数据结构详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】C语言结构体详解

    目录 前言 一、结构体的定义 二、定义结构体变量 三、结构体变量的初始化 四、使用typedef声明新数据类型名 五、指向结构体变量的指针 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转

    2024年02月04日
    浏览(46)
  • 算法、数据结构、计算机系统、数据库MYSQL、概率论、数学实验MATLAB、数学建模、马原、英语、杂项、QT项目

    可以三个条件 以此类推 (condition1)?x:(condition2)?y:z string变成int int 变成string 可以用循环 模运算展开式推导 我们要证明等式: (a * b) mod m = ((a mod m) * (b mod m)) mod m 假设 a = q1 * m + r1 ,其中 q1 是 a 除以 m 的商, r1 是 a 除以 m 的余数。类似地,假设 b = q2 * m + r2 ,其中

    2024年02月08日
    浏览(61)
  • 【数据结构】C语言队列(详解)

    前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现队列 目录 一.队列概念及结构 1.1队列的概念 1.2队列的结构 二.队列的实现 2.1头文件 2.2链式队列的结构定义 2.3队列接口的定义 2.4初始化队列 2.5判断队列

    2024年02月10日
    浏览(44)
  • 数据结构——二叉树基础结构篇(C语言)

    现在是北京时间2023年6月13日9点11分。从决定要开始减脂之后,饥饿总是伴随着我。一觉起来肚子咕咕叫,我还是想先把文章发了再吃第一餐。燕麦加蛋白粉几乎伴随了我大学的第一年早饭。昨天练了一个小时背,练背后还做了45分钟有氧。空腹训练没有影响我的训练状态。这

    2024年02月08日
    浏览(38)
  • 【数据结构】栈---C语言版(详解!!!)

    栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底 。栈中的数据元素遵守 后进先出LIFO (Last In First Out)的原则。 压栈 :栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。 出栈 :栈的删除

    2024年02月10日
    浏览(37)
  • 数据结构(C语言)——顺序表详解

    数据结构是计算机存储和组织数据的方式。常用的数据结构有:数组(Array)、栈(Stack)、队列(Queue)、链表(Linked List)、树(Tree)、图(Graph)、堆(Heap)等;而数据结构又可以通过逻辑结构与物理结构进行分类,逻辑结构是指数据元素之间的逻辑关系,也就是数据元

    2024年04月16日
    浏览(38)
  • 【数据结构】队列---C语言版(详解!!!)

    队列 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有 先进先出FIFO (First In First Out) 入队列:进行插入操作的一端称为队尾 出队列:进行删除操作的一端称为队头 入队列 :进行插入操作的一端称为队尾 出队列 :进行删除操作的一端称

    2024年02月10日
    浏览(50)
  • 数据结构-循环队列详解(c语言版)

    目录 一、什么是循环队列? 二、特点 三、基本运算 四、代码实现  1、初始化 2、入队 3、出队 4、队满? 5、队空?  6、输出队列 7、队列大小 8、获取队首元素 五、队列应用场景 六、完整代码 1、完整代码 2、运行结果 七、总结 前言 相比于链队列, 循环队列 有着内存固

    2024年01月20日
    浏览(55)
  • 追梦之旅【数据结构篇】——详解小白如何使用C语言实现堆数据结构

        😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介:一名热爱C/C++,算法等技术、喜爱运动、热爱K歌、敢于追梦的小博主! 😘博主小留言:哈喽! 😄各位CSDN的uu们,我是你的博客好友小梦,希望我的文章可以给您带来一定的帮助,话不

    2023年04月17日
    浏览(43)
  • (详解)数据结构-----------栈与队列 c语言实现

    本章将会详细讲解以下知识点: 目录 一:栈         1:栈的定义,栈的特点         2:用什么结构来实现栈与原因的分析?         3:  (超详解)栈的常用接口并且附上测试用例 二:队列         1:队列的定义,队列的特点         2:用什么结构来实现队列与原因的分析

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包