第三篇:跨平台QT开发-容器

news2024/11/27 17:55:04

Qstring

Qstring的隐式共享

 隐式数据共享机制去最大化资源有效利用和最小化复制克隆操作。隐式共享类当作为函数参数传递的时候,不 仅安全而且效率很高,因为传递的时候只是传递的数据的指针,数据本身只当自己被修改的时候才会去复制。简称写时复制。

数据相同时,执行浅拷贝,仅复制指向数据块的指针 数据不同时则执行深拷贝。 隐式共享技术可以大大降低对内存的开销及 CPU 资源的消耗,很大程度提高应用程序的运行效率
QString 类保存了 16 位的 Unicode 值, Unicode 把所有语言都统一到一套编码里, Unicode 提供 UTF-8 UTF-16 UTF-32 编码方式。UTF-8 以字节为单位对 Unicode 进行编码,对不同范围的字符使用不同长度的编码。对于 0x00-0x7F 之间的字符,
UTF-8 编码与 ASCII 编码完全相同。

    QString s0 = "Hello";  //数据块hello的引用计数+1
    QString s1 = s0;        //数据块hello的引用计数+1=2
    QString s2 = s0;        //数据块hello的引用计数3
    QString s3 = "Hi";      //数据块hello引用计数2
                                      //数据块hi引用计数1
    QString s4 = s3;        //数据块hi引用计数2
    QString s5 = s0;       //数据块hello引用计数3

QString常用的初始化方式

    QString s0 = "Hello"; //数据块hello的引用计数+1
    QString s1 = s0;      //数据块hello的引用计数+1=2
    QString s2 = s0;      //数据块hello的引用计数3
    QString s3 = "Hi";    //数据块hello引用计数2
        //数据块hi引用计数1
    QString s4 = s3; //数据块hi引用计数2
    QString s5 = s0; //数据块hello引用计数3

    //const char*初始化
    QString str("小强");
    qDebug() << str;
    //对象初始化
    QString str1 = "hello";
    QString str2 = str1;
    //Qchar数组初始化QString
    QChar chell[4] = {'h', 'e', 'l', 'l'};
    QString str3(chell, sizeof(chell) / sizeof(chell[0]));
    qDebug() << str3;

   QString常用的转换

    //QString 转int ,float,double
    QString strAge("18");
    QString strFloat("3.14");
    int age = strAge.toInt();
    float numFloat = strFloat.toFloat();
    double numDouble = strFloat.toFloat();
    qDebug() << "age: " << age << " "
             << "numFloat: " << numFloat << " "
             << "numDouble: " << numDouble;
    //int ,float ,double转QString
    int age1 = 19;
    int age2 = 19;
    float float1 = 3.14;
    double float2 = 15.26;

    QString strage1, strage2, strFloat1, strFloat2; //用来接收数据
    strage1 = strage1.number(age1);
    strage2 = strage2.setNum(age2);
    strFloat1 = strFloat1.number(float1);
    strFloat2 = strFloat2.setNum(float2);
    qDebug() << "number转换的age1: " << strage1 << "setnum转换的age2: " << strage2;
    qDebug() << "number转换的float1: " << strFloat1 << "setnum转换的float2: " << strFloat2;

    //const char *转QString
    const char *hi = "hello word";
    QString Chi(hi);
    qDebug() << "const char *转QString" << Chi;

    //QString 转 QByteArray和const char *
    QString Qstr = "QString Qstr";
    QByteArray arrayStr = Qstr.toUtf8();
    const char *CStr = arrayStr.data();
    qDebug() << "QString 转 QByteArray和const char *" << arrayStr << " " << CStr;

    //QString转Qdatatime
    QString time = "2024.11.03 10:10:10";
    QDateTime dataTime = QDateTime::fromString(time, "yyyy.MM.dd hh:mm:ss"); //月是大写M,分是小写m;
    qDebug() << dataTime;

    //Qdatetime转QString
    QDateTime dataTime1 = QDateTime::currentDateTime(); //获取当前时间
    QString TimeString = dataTime1.toString("yyyy-MM-dd hh:mm:ss");//指定接收日期的格式
    qDebug() << dataTime1;

 QString常用的方法

    //字符串拼接
    QString str1 = "小滕";
    str1 += "和文博波";
    str1.append("一起玩水");
    qDebug() << str1;
    //字符串格式化
    QString str2, str3;
    str2.sprintf("%s%d%s", "史前", 400, "万年");
    str3.sprintf("%s%d%s%2.1f%s", "史前", 400, "万年有", 0.5, "个人");
    qDebug() << str2 << endl << str3;
    //字符串的arg()组合
    QString str4, str5;
    str4 = QString("%1%2%3").arg("史前").arg(400).arg("万年");
    str5 = QString("%1%2%3%4%5").arg("史前").arg(400).arg("万年有").arg(0.5).arg("个人Cap");
    qDebug() << "str4: " << str4 << endl << "str5: " << str5;
    //返回索引n的地方at()//QChar-->QChar和char不同,是占两个字节
    QChar s1 = str4.at(2);
    qDebug() << s1;
    //insert插入字符//值是QByteArray
    //mid截取字符串,以字节计数

    QString s2 = str4.insert(7, str5.toUtf8().mid(15));
    qDebug() << s2;
    QString line(100, '-');
    qDebug() << line;
    //在字符串起始位置插入prepend
    QString s3 = s2.prepend("      Cap人类:");
    qDebug() << s3;
    //去除两端的空格trimmed
    qDebug() << s3.trimmed();
    //去除两端空格用''代替,simplified
    //qDebug() << s3.simplified();
    //查询startwith,endwidth,contains;返回值bool
    qDebug() << "是否以史前开头" << str4.startsWith("史前");
    qDebug() << "是否以cap结尾" << str5.endsWith("cap", Qt::CaseInsensitive); //忽略大小写
    qDebug() << "是否包含人这个字" << str5.contains("人");
    //compare比较两个字符串
    QString ss = "tom like timi";
    QString ss1 = "Tome like timi";
    qDebug() << ss << endl
             << ss1 << endl
             << "比较结果[相等为0]: " << QString::compare(ss, ss1, Qt::CaseSensitive); //计较大小写
    //分割字符串split()
    QStringList ll = ss1.split(" "); //以空格分割
    foreach (QString list, ll) {
        qDebug() << list;
    }

 QStringList容器

   QStringList strList;
    strList << "星期一"
            << "星期二"
            << "星期三"
            << "星期四"
            << "星期五"
            << "星期六";
    strList.append("星期七");
    qDebug() << "for循环遍历: ";
    for (int i = 0; i < strList.size(); i++) {
        qDebug() << strList.at(i);
    }
    qDebug() << "foreach遍历: ";
    foreach (QString list, strList) {
        qDebug() << list;
    }
    qDebug() << "STL风格的遍历: ";
    QStringList::Iterator it = strList.begin();
    for (; it != strList.end(); it++) {
        qDebug() << *it;
    }
    qDebug() << "Java风格遍历: ";
    QListIterator<QString> it1(strList);
    while (it1.hasNext()) {
        qDebug() << it1.next();
    }

    strList.removeFirst();
    qDebug() << "删除第一个元素之后" << strList;
    strList.removeLast();
    qDebug() << "删除最后元素之后" << strList;
    strList.removeAt(2);
    qDebug() << "删除第二个元素之后" << strList;
    strList.clear();
    qDebug() << "clear之后" << strList; 

QList<int> 

java风格的

容器类
只读迭代器
读写迭代器
QList<T>,QQueue<T>
QListIterator<T>
QMutableListIterator<T>
QLinkedList<T>
QLinkedListIterator<T>
QMutableLinkedListIterator<T>
QVector<T>,QStack<T>
QVectorIterator<T>
QMutableVectorIterator<T>

STL风格的

容器类
只读迭代器
读写迭代器
QList<T>,QQueue<T>
QList<T>::const_iterator
QList<T>::iterator
QLinkedList<T>
QLinkedList<T>::const_iterator
QLinkedList<T>::iterator
QVector<T>,QStack<T>
QVector<T>::const_iterator
QVector<T>::iterator

继承自QStringList

支持at()和[]进行索引,prepend,append,insert,

修改元素: replace, 和[ ]进行修改

 //java风格的遍历器
    QMutableListIterator<int> itw(list); //QListIterator<int>//只读
    qDebug() << "正序遍历: ";
    for (itw.toFront(); itw.hasNext();) {
        qDebug() << itw.next();
    }
    for (itw.toFront(); itw.hasNext();) {
        if (itw.next() == 0) {
            itw.setValue(99);
        }
    }
    qDebug() << "反序遍历: ";
    for (itw.toBack(); itw.hasPrevious();) {
        qDebug() << itw.previous();
    }
    //STL风格读写遍历
    QList<int>::Iterator itw1 = list.begin();
    //QList<int>::const_iterator itw = list.constBegin();//只读遍历
    for (; itw1 != list.end(); itw1++) {
        qDebug() << *itw1;
    }

QLinkedList 

 继承自QStringList,但是代码运行可能比Qlist快

不支持at()和[ ]的索引

 QLinkedList<QString> week;
    for (int i = 1; i < 8; ++i) {
        week << QString("%1%2").arg("星期").arg(i);
    }
    QMutableLinkedListIterator<QString> it_rw(week);
    qDebug() << "正序遍历: ";
    for (it_rw.toFront(); it_rw.hasNext();) {
        qDebug() << it_rw.next();
    }
    for (it_rw.toFront(); it_rw.hasNext();) {
        QString sss = it_rw.next();
        if (sss == "星期1") {
            it_rw.setValue("星期一");
        }
    }
    QLinkedListIterator<QString> it_r(week);
    qDebug() << "修改后用只读正序遍历: ";
    for (it_r.toFront(); it_r.hasNext();) {
        qDebug() << it_r.next();
    }
    QLinkedList<QString>::Iterator STL_rw;
    QLinkedList<QString>::const_iterator STL_r; //只读
    STL_r = week.begin();
    for (; STL_r != week.end(); STL_r++) {
        qDebug() << *STL_r;
    }

 

QVector

    QVector<QString> name;
    name << "张三"
         << "李四";
    name.insert(2, "王五");
    name.insert(0, "张三1");
    name.prepend("李一");
    name.append("赵六");
    qDebug() << name;
    //修改元素
    name.replace(1, "田二");
    qDebug() << name;
    //删除元素,removefirst,removelast ,removeall
    name.removeOne("李一");
    qDebug() << name;
    QMutableVectorIterator<QString> it_rRw(name);
    //STL风格的迭代器
    QVector<QString>::Iterator it_name = name.begin();
    for (; it_name != name.end(); it_name++) {
        qDebug() << *it_name;
    }
    for (it_rRw.toFront(); it_rRw.hasNext();) {
        QString ssr = it_rRw.next();
        if (ssr == "赵六") {
            it_rRw.setValue("李一");
        }
    }
    for (it_rRw.toFront(); it_rRw.hasNext();) {
        qDebug() << it_rRw.next();
    }
    QString line(100, '-');
    qDebug() << line;

Qmap,QMultMap

QMap 与 QHash 差别:
①QHash 比 QMap 查找速度更快。
②QHash 以任意顺序存储,QMap 以 Key 顺序存储数据。
③QHash 的 Key 必须提供 operator==()及一个全局的 qHash(Key)函数,而 QMap 的 Key 必
须提供 operator<()函数。 

有序数据

    QMap<QString, QString> Qmap;
    //插入数据
    Qmap.insert("spring", "25℃");
    Qmap.insert("summer", "35℃");
    Qmap.insert("autumn", "15℃");
    Qmap.insert("fall", "15℃");
    Qmap.insert("winter", "-5℃");
    qDebug() << Qmap;
    //删除数据
    Qmap.remove("fall");
    qDebug() << Qmap;
    //通过key访问vlues
    qDebug() << "autumn的温度: " << Qmap.key("autumn");
    //通过vlues访问key
    qDebug() << "15℃的键: " << Qmap.key("15℃");

    //Java的只读迭代器
    QMapIterator<QString, QString> it_r(Qmap);
    for (it_r.toFront(); it_r.hasNext();) {
        it_r.next();
        qDebug() << it_r.key() << ":" << it_r.value();
    }
    //Java的读写迭代器
    QMutableMapIterator<QString, QString> it_rw(Qmap);
    if (it_rw.findNext("15℃")) {
        it_rw.setValue("10℃");
    }
    qDebug() << "修改后";
    for (it_rw.toFront(); it_rw.hasNext();) {
        it_rw.next();
        qDebug() << it_rw.key() << ":" << it_rw.value();
    }
    //STL风格迭代器
    qDebug() << "STL风格迭代器:";
    QMap<QString, QString>::Iterator T_r = Qmap.begin();
    for (; T_r != Qmap.end(); T_r++) {
        qDebug() << T_r.key() << ":" << T_r.value();
    }
    T_r = Qmap.find("spring");
    if (T_r != Qmap.end()) {
        T_r.value() = "30℃";
    }
    qDebug() << "修改春天的数据之后遍历:";
    T_r = Qmap.begin();
    for (; T_r != Qmap.end(); T_r++) {
        qDebug() << T_r.key() << ":" << T_r.value();
    }

 

 QMultMap

 QMultiMap<QString, QString> Qmap1;
    //插入数据
    Qmap1.insert("spring", "25℃");
    Qmap1.insert("summer", "35℃");
    Qmap1.insert("autumn", "15℃");
    Qmap1.insert("fall", "15℃");
    Qmap1.insert("fall", "16℃");
    Qmap1.insert("fall", "17℃");
    Qmap1.insert("fall", "18℃");
    Qmap1.insert("winter", "-5℃");
    qDebug() << Qmap1;
    qDebug() << "删除数据fall", "15℃后";
    Qmap1.remove("fall", "15℃");
    qDebug() << "fall:" << Qmap1.values("fall");
    QMap<QString, QString>::Iterator T_r1 = Qmap1.begin();
    for (; T_r1 != Qmap1.end(); T_r1++) {
        qDebug() << T_r1.key() << ":" << T_r1.value();
    }

Qhash

无序数据,

    QHash<int, QString> hash1;
    hash1.insert(1, "小滕");
    hash1.insert(2, "文博波");
    hash1[3] = "lpy";
    hash1[4] = "ssss";
    hash1.insertMulti(4, "sss1");
    QHash<int, QString>::Iterator hash_rw = hash1.begin();
    for (; hash_rw != hash1.end(); ++hash_rw) {
        qDebug() << *hash_rw;
    }
    //修改数据
    hash_rw = hash1.find(4);
    if (hash_rw != hash1.end()) {
        hash_rw.value() = "44";
    }
    qDebug() << "修改数据之后";
    hash_rw = hash1.begin();
    for (; hash_rw != hash1.end(); ++hash_rw) {
        qDebug() << *hash_rw;
    }

 Qvariant

QVariant 类是 Qt 的共 用体 union 数据 类型, 不仅 能保存 很多 Qt 类型 的值, 包括
QColor,QBrush,QFont,QRect,QString 及 QSize 等等,而且能存放 Qt 的容器类型值。
可采用 toT()将 QVariant 对象转换称为 T 类型并获取其值 。如 toInt(),toFloat(),toString(),可
用 type 方法获取数据类型,判断数据是否可。
对于 GUI 模块中定义的数据类型没有相应的转换函数,即没有 toColor(),没有 toImage()这样的函数提供,可通过 value()方法实现转换, 判断两种类型是否可以转换时可通过canConvert()方法的返回值判断。

 

QVariant vimInt(18);
    qDebug() << vimInt.toInt();

    QVariant vimString("hello");
    qDebug() << vimString.canConvert(QVariant::Int); //有没有转换的能力
    qDebug() << vimString.toString();

    qDebug() << vimString.convert(QVariant::Int); //转换有没有成功
    qDebug() << vimString.toString();             //没转换成功值会被覆盖

    qDebug() << vimInt.convert(QVariant::Int); //转换有没有成功
    qDebug() << vimInt.toString();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1432968.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

One time pad 图像加密MATLAB程序

使用一次加密的形式对图像进行加密。 采用异或的方式实现。 加密、解密结果如下: 程序代码如下: % 读取原始图像并显示 originalImage = imread(lena256.bmp); % 更换为你的图像文件名 subplot(1,3,1),imshow(originalImage); title(Original Image);% 生成与图像相同大…

【ROS机器人系统】实验1 熟悉ROS操作系统、熟悉ROS通信架构

文章目录 实验1 熟悉ROS操作系统、熟悉ROS通信架构1、实验目的2、实验设备3、实验内容3.1 安装ROS3.2 ROS常用指令以及小海龟示例roscore命令rosrun命令rosnode 命令roscd 命令rostopic 命令 动手实现1&#xff1a;rosservice 命令roslaunch 命令 动手实现2&#xff1a;动手实现…

Android Studio 安装Flutter插件但是没法创建项目

Android Studio 安装Flutter插件但是没法创建项目 如果你在Android Studio已经安装了Dart、Flutter插件&#xff0c;但是不能创建Flutter项目。 原因是因为Android Studio的版本更新&#xff0c;Android APK Support这个插件没被选中。 一旦勾选这个插件之后&#xff0c;就能…

leetcode 3.无重复字符的最长字串(滑动窗口) (C++)DAY2

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示…

天猫数据分析:2023年坚果炒货市场年销额超71亿,混合坚果成多数消费者首选

近年来&#xff0c;随着人们生活水平和健康意识的提升&#xff0c;在休闲零食市场中&#xff0c;消费者们也越来越关注食品的营养价值&#xff0c;消费者这一消费偏好的转变也为坚果炒货食品行业带来了发展契机。 整体来看&#xff0c;坚果炒货市场的体量较大。根据鲸参谋电商…

【Linux】EXT2文件系统 | 磁盘分区块组 | inode

文章目录 一、前言二、EXT2文件系统 - 逻辑存储结构&#x1f4be;分区&#xff08;Partition&#xff09;分区的概念每个分区的内容Linux下查询磁盘分区 &#x1f4be;块组&#xff08;Block Group&#xff09;磁盘格式化每个块组的内容1. Superblock&#xff08;超级块&#x…

5.0 HDFS 集群服务建立教程

HDFS 集群是建立在 Hadoop 集群之上的&#xff0c;由于 HDFS 是 Hadoop 最主要的守护进程&#xff0c;所以 HDFS 集群的配置过程是 Hadoop 集群配置过程的代表。 使用 Docker 可以更加方便地、高效地构建出一个集群环境。 每台计算机中的配置 Hadoop 如何配置集群、不同的计…

vue2 el-table新增行内删除行内(两种写法)里面第一个是树组件,第二个是数字组件,第一个数组件只能勾选最后一个节点

第一种 <template><div class"time_table"><div style"margin-bottom: 10px"><el-button click"addRowFn">新增</el-button></div><el-form ref"costForm" :model"formData">&l…

云原生数据库 GaiaDB 的核心技术演进和解析

导读 在越来越强调云原生的环境下&#xff0c;存算分离作为一种新的架构理念&#xff0c;已经是大势所趋。新的技术架构带来新的问题和挑战&#xff0c;百度智能云的云原生数据库 GaiaDB 采用 Quorum 分布式协议、高性能网络、高可靠分布式存储引擎等技术实现更高的性能和可用性…

[开源]GPT Boss – 用图形化的方式部署您的私人GPT镜像网站

在这个以数据和智能为核心的时代&#xff0c;掌握最新的技术趋势是每个企业和个人都需要做到的。这就是GPT Boss存在的意义&#xff1a;一个基于OpenAI技术的一站式GPT应用解决方案。 自2022年起&#xff0c;GPT Boss团队便投身于人工智能领域&#xff0c;将OpenAI的GPT模型带给…

Bard 最新更新:全球开放访问Gemini Pro并生成图片

深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领域的领跑者。点击订阅&#xff0c;与未来同行&#xff01; 订阅&#xff1a;https://rengongzhineng.io/ 。 今…

2024/2/4学习记录

微信小程序 网络数据请求 出于安全性方面的考虑&#xff0c;小程序官方对数据接口得请求做出了俩个限制 只能对 https 类型的接口必须将接口的域名添加到信任列表中 需要去这里设置 域名只支持 https 协议域名不能使用 ip 地址 或者localhost域名必须经过 ICP 备案 服务器域…

在 iOS 上安装自定企业级应用

了解如何安装您的组织创建的自定应用并为其建立信任。 本文适用于学校、企业或其他组织的系统管理员。 您的组织可以使用 Apple Developer Enterprise Program 创建和分发企业专用的 iOS 应用&#xff0c;以供内部使用。您必须先针对这些应用建立信任后&#xff0c;才能将其打…

Excel没有内置统计字数功能,但可以用一些变通的方法

是否需要计算Excel工作簿中某个单元格或单元格范围内的单词数? 出于多种原因,你可能需要计算文本数据中的字数。也许你有逗号分隔的列表,需要计算每个列表中的项目数。 不幸的是,Excel没有内置的单词计数方法。但是有一些聪明的方法可以得到你需要的结果。 这篇文章将向…

【开源】基于JAVA+Vue+SpringBoot的软件学院思政案例库系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理员2.2 普通教师 三、系统展示四、核心代码4.1 查询思政案例4.2 审核思政案例4.3 查询思政课程4.4 思政案例点赞4.5 新增思政案例评语 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的软件学…

文心一言 VS 讯飞星火 VS chatgpt (194)-- 算法导论14.3 2题

二、用go语言&#xff0c;改写 INTERVAL-SEARCH 的代码&#xff0c;使得当所有区间都是开区间时&#xff0c;它也能正确地工作。 文心一言&#xff0c;代码正常运行&#xff1a; 在Go语言中&#xff0c;处理开区间&#xff08;open intervals&#xff09;时&#xff0c;我们需…

Linux的库文件

概述&#xff1a; 库文件一般就是编译好的二进制文件&#xff0c;用于在链接阶段同目标代码一块生成可执行文件&#xff0c;或者运行可执行文件的时候被加载&#xff0c;以遍调用库文件中的某段代码。 动态链接都是索引的.so文件&#xff0c;静态链接都是压缩打包的.a文件。 …

配置visualsvn提交后自动邮件通知

参考&#xff1a; https://blog.csdn.net/wiker_yong/article/details/10334967 # -*- coding: utf-8 -*- import sys import os import smtplib from email.mime.text import MIMEText from email.header import Headermail_host smtp.163.com #发送邮件的smtp地址 mail_us…

【RPA】什么是RPA

一、什么是RPA? RPA&#xff0c;全称机器人流程自动化&#xff0c;是一种利用机器人技术实现工作信息与业务交互自动化的过程。它能够按照预先设计的流程&#xff0c;高效地处理大量的工作信息与业务交互&#xff0c;极大地节约了人工成本。如今&#xff0c;RPA已成为智能化软…

26.云原生ArgoCD高级之ApplicationSet

云原生专栏大纲 文章目录 ApplicationSet介绍ApplicationSet 特性ApplicationSet 安装ApplicationSet 工作原理ApplicationSet 生成器列表类型生成器集群生成器基础使用方法Label Selector 指定集群Values 字段传递额外的参数 git生成器git目录生成参数排除目录git文件生成器矩…