龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4297|回复: 0

C/C++ Qt 常用数据结构

[复制链接]

13

主题

2

回帖

20

积分

编程入门

Rank: 1

龙马币
54

Qt 是一个跨平台的图形化类库,常用数据结构就是对C++ STL的二次封装,使其更加易用,如下是经常会用到的一些数据结构和算法,其中包括了QString,QList,QLinkedList,QVector,QStack,QQueue,qmap,qmultimap,qhash,qmultihash,qmultihash,qset容器的具体使用细节。

字符串容器

QString 追加/删除:
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QChar>
  4. #include <QString>

  5. int main(int argc, char *argv[])
  6. {
  7.     QCoreApplication a(argc, argv);

  8.     // 定义两个字符串并将其链接在一起
  9.     QString Str1 = "hello", Str2 = "lyshark",temp;
  10.     temp = Str1 + Str2;

  11.     std::cout << temp.toStdString().data() << std::endl;
  12.     std::cout << (Str1+Str2).toStdString().data() << std::endl;

  13.     // 使用append/remove 追加与移除
  14.     QString Str3 = "hello ";
  15.     Str3.append("lyshark");
  16.     Str3.push_back("test");
  17.     Str3.remove("hello");
  18.     Str3.prepend("-->");
  19.     std::cout << Str3.toStdString().data() << std::endl;

  20.     // 使用Sprintf/arg 将特定字符串连接
  21.     QString Str4;
  22.     Str4.sprintf("%s %s","Welcome","to you !");
  23.     std::cout << Str4.toStdString().data() << std::endl;

  24.     QString Str5;
  25.     Str5 = QString("%1 is age =  %2 . ").arg("lyshark").arg("24");
  26.     std::cout << Str5.toStdString().data() << std::endl;
  27.     std::cout << (QString("1") + QChar('A')).toStdString().data() << std::endl;
  28.     std::cout << (QString("2") + QString('B')).toStdString().data() << std::endl;

  29.     // 实现统计字符串长度
  30.     std::cout << Str5.count() << std::endl;
  31.     std::cout << Str5.size() << std::endl;
  32.     std::cout << Str5.length() << std::endl;

  33.     // 去空格
  34.     QString Str6 = " hello  lyshark   welcome !  ";
  35.     Str6 = Str6.trimmed();    // 去掉首尾空格
  36.     Str6 = Str6.simplified();   // 去掉所有空格,中间连续的只保留一个
  37.     std::cout << Str6.toStdString().data() << std::endl;

  38.     Str6 = Str6.mid(2,10);       // 从索引2开始向后取10
  39.     std::cout << Str6.toStdString().data() << std::endl;

  40.     //移除,1,3两个位置的字符
  41.     std::cout << (QString("123456").remove(1,3)).toStdString().data() << std::endl;

  42.     // 超过 11 个字符就保留 11 个字符,否则不足替换为 '.'
  43.     std::cout << (QString("abcdefg").leftJustified(11,'.',true)).toStdString().data() << std::endl;

  44.     std::cout << (QString::number(100,16)).toStdString().data() << std::endl;    // 100 转16进制

  45.     // 转换为 16 进制,不足 8 位前面补 ‘0’
  46.     std::cout << (QString("0%1").arg(123,8,16,QLatin1Char('0'))).toStdString().data() << std::endl;

  47.     // 转为8进制
  48.     std::cout << QString("0%1").arg(QString::number(100,8)).toStdString().data() << std::endl;
  49.     std::cout << (QString("0%1").arg(QString::number(.777,'f',1))).toStdString().data() << std::endl;

  50.     // 切割字符串
  51.     std::cout << (QString("1,2,3,4,5,6").split(',')[2]).toStdString().data() << std::endl;

  52.     // 类型转换  QByteArray 转换 QString
  53.     QByteArray byte;

  54.     byte.resize(2);
  55.     byte[0]='1';
  56.     byte[1]='2';
  57.     QString strs = byte;

  58.     return a.exec();
  59. }
复制代码



QString 查询/替换: 字符串的查询,替换,扫描与切割。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>

  4. int main(int argc, char *argv[])
  5. {
  6.     QCoreApplication a(argc, argv);

  7.     // 查询与替换
  8.     QString str = "hello lyshark welcome admin";
  9.     int index;
  10.     bool ref;

  11.     // 查询字符串中是否包含特定字符
  12.     ref = str.contains("lyshark",Qt::CaseInsensitive);  // 不区分大小写
  13.     std::cout << ref << std::endl;

  14.     ref = str.contains("LYSHARK",Qt::CaseSensitive);    // 区分大小写
  15.     std::cout << ref << std::endl;

  16.     // 判断是否以某个字符串开头或结束
  17.     ref = str.startsWith("hello",Qt::CaseInsensitive); // 判断是否hello开头
  18.     std::cout << ref << std::endl;

  19.     ref = str.endsWith("lyshark",Qt::CaseSensitive);        // 判断是否lyshark结尾
  20.     std::cout << ref << std::endl;

  21.     // 从字符串中取左边/右边多少个字符
  22.     index = str.indexOf(" ");        // 第一个空格出现的位置
  23.     std::cout << str.left(index).toStdString().data()<< std::endl;

  24.     index = str.lastIndexOf(" ");    // 最后一个空格出现的位置
  25.     std::cout << str.right(str.size() - index - 1).toStdString().data() << std::endl;

  26.     // 替换字符串中所有的lyshark为admin
  27.     str = str.replace("lyshark","admin");
  28.     std::cout << str.toStdString().data() << std::endl;

  29.     // 字符串的截取
  30.     QString str2 = "uname,uage,usex";
  31.     std::cout << str2.section(",",0,0).toStdString().data() << std::endl;
  32.     std::cout << str2.section(",",1,1).toStdString().data() << std::endl;

  33.     QString str3 ="192.168.1.10";
  34.     std::cout << str3.left(str3.indexOf(".")).toStdString().data() << std::endl;
  35.     std::cout << str3.mid(str3.indexOf(".")+1,3).toStdString().data() << std::endl;
  36.     std::cout << str3.mid(str3.indexOf(".")+1,1).toStdString().data() << std::endl;
  37.     std::cout << str3.right(str3.size() - (str3.lastIndexOf(".")+1)).toStdString().data() << std::endl;

  38.     // 判断字符串是否为空
  39.     QString str4,str5="";
  40.     std::cout << str4.isNull() << std::endl;    // 为空则为True
  41.     std::cout << str5.isNull() << std::endl;    // \0不为空
  42.     std::cout << str5.isEmpty() << std::endl;   // 为空则为False

  43.     return a.exec();
  44. }
复制代码



QString 字符串转换:
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QByteArray>

  5. int main(int argc, char *argv[])
  6. {
  7.     QCoreApplication a(argc, argv);

  8.     QString str = "uname,uage,usex";
  9.     QString int_str = "100,200,300";

  10.     // 大小写转换
  11.     str = str.toUpper();            // 转为大写
  12.     std::cout << str.toStdString().data() << std::endl;
  13.     str = str.toLower();            // 转为小写
  14.     std::cout << str.toStdString().data() << std::endl;

  15.     // 将字符串转为整数
  16.     bool flag = false;
  17.     QString x = int_str.section(",",0,0);   // 提取出第一个字符串

  18.     int dec = x.toInt(&flag,10);              // 转为十进制整数
  19.     std::cout << dec << std::endl;

  20.     int hex = x.toUInt(&flag,16);            // 转为十六进制数
  21.     std::cout << hex << std::endl;

  22.     // 将整数转为字符串
  23.     int number = 100;
  24.     QString number_str;

  25.     number_str = number_str.setNum(number,16);  // 转为十六进制字符串
  26.     std::cout << number_str.toStdString().data() << std::endl;

  27.     // 编码之间的转换
  28.     QString str_string = "welcome to you !";

  29.     QByteArray ba = str_string.toUtf8();
  30.     std::cout << ba.toStdString().data() << std::endl;

  31.     // 格式化输出转换
  32.     float total = 3.1415926;
  33.     QString str_total;

  34.     str_total = str_total.sprintf("%.4f",total);
  35.     std::cout << str_total.toStdString().data() << std::endl;

  36.     str_total = QString::asprintf("%2f",total);
  37.     std::cout << str_total.toStdString().data() << std::endl;

  38.     return a.exec();
  39. }
复制代码



顺序容器
顺序容器 QList,QLinkedList,QVector,QStack,QQueue
qlist: 顺序容器,qlist是以下表的方式对数据进行访问的,可以使用下表索引的方式访问特定数据。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QList>

  4. void Display(QList<QString> &ptr)
  5. {
  6.     std::cout << "-----------------------------" << std::endl;
  7.     for(qint32 x=0;x<ptr.count();x++)
  8.     {
  9.         // std::cout << ptr[x].toStdString().data() << std::endl;
  10.         std::cout << (ptr.at(x)).toStdString().data() << std::endl;
  11.     }
  12.     std::cout << std::endl;
  13. }

  14. int main(int argc, char *argv[])
  15. {
  16.     QCoreApplication a(argc, argv);

  17.     QList<QString> StringPtrA;
  18.     QList<QString> StringPtrB;

  19.     // 添加三个成员
  20.     StringPtrA.append("admin");
  21.     StringPtrA.append("guest");
  22.     StringPtrA.append("lyshark");
  23.     Display(StringPtrA);

  24.     // 在首部插入hanter
  25.     StringPtrA.prepend("hanter");
  26.     Display(StringPtrA);

  27.     // 在第0的位置插入lucy
  28.     StringPtrA.insert(0,QString("lucy"));
  29.     Display(StringPtrA);

  30.     // 替换原来的admin为全拼
  31.     StringPtrA.replace(1,"Administrator");
  32.     Display(StringPtrA);

  33.     // 删除第0个元素
  34.     StringPtrA.removeAt(0);
  35.     Display(StringPtrA);

  36.     // 删除首部和尾部
  37.     StringPtrA.removeFirst();
  38.     StringPtrA.removeLast();

  39.     // 移动两个变量
  40.     StringPtrA.move(0,1);
  41.     Display(StringPtrA);

  42.     // 将两个list容器对调交换
  43.     StringPtrB = {"youtube","facebook"};
  44.     StringPtrA.swap(StringPtrB);
  45.     Display(StringPtrA);
  46.     return a.exec();
  47. }
复制代码



qlist可以指定一个struct结构进行数据操作.
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QList>
  4. #include <QListIterator>
  5. #include <QMutableListIterator>

  6. struct MyStruct
  7. {
  8.     qint32 uid;
  9.     QString uname;
  10. };

  11. int main(int argc, char *argv[])
  12. {
  13.     QCoreApplication a(argc, argv);

  14.     QList<MyStruct> ptr;
  15.     MyStruct str_ptr;

  16.     str_ptr.uid = 1001;
  17.     str_ptr.uname = "admin";
  18.     ptr.append(str_ptr);

  19.     str_ptr.uid = 1002;
  20.     str_ptr.uname = "guest";
  21.     ptr.append(str_ptr);

  22.     // 使用传统方式遍历数据
  23.     for(qint32 x=0;x<ptr.count();x++)
  24.     {
  25.         std::cout << ptr.at(x).uid << std::endl;
  26.         std::cout << ptr[x].uname.toStdString().data() << std::endl;
  27.     }

  28.     // 使用只读迭代器遍历
  29.     QListIterator<MyStruct> x(ptr);
  30.     while(x.hasNext())
  31.     {
  32.         // peeknext读取下一个节点,但不影响指针变化
  33.         std::cout << x.peekNext().uid << std::endl;
  34.         std::cout << (x.peekNext().uname).toStdString().data() << std::endl;
  35.         // 最后将x指针指向下一个数据
  36.         x.next();
  37.     }

  38.     // 使用读写迭代器:如果uid=1002则将guest改为lyshark
  39.     QMutableListIterator<MyStruct> y(ptr);
  40.     while(y.hasNext())
  41.     {
  42.         // y.peekNext().uid = 9999;
  43.         if(y.peekNext().uid == 1002)
  44.         {
  45.             y.peekNext().uname = "lyshark";
  46.         }
  47.         y.next();
  48.     }
  49.     return a.exec();
  50. }
复制代码



qlinklist: qlinklist就是动态链表结构,数据的存储非连续,访问时无法直接使用下标定位,只能通过迭代器迭代寻找,参数定义与qlist基本一致。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QLinkedList>
  4. #include <QLinkedListIterator>
  5. #include <QMutableLinkedListIterator>

  6. struct MyStruct
  7. {
  8.     qint32 uid;
  9.     QString uname;
  10. };

  11. int main(int argc, char *argv[])
  12. {
  13.     QCoreApplication a(argc, argv);

  14.     QLinkedList<MyStruct> ptr;
  15.     MyStruct str_ptr;

  16.     str_ptr.uid = 1001;
  17.     str_ptr.uname = "admin";
  18.     ptr.append(str_ptr);

  19.     str_ptr.uid = 1002;
  20.     str_ptr.uname = "guest";
  21.     ptr.append(str_ptr);


  22.     // 使用只读迭代器遍历: 从前向后遍历
  23.     QLinkedListIterator<MyStruct> x(ptr);
  24.     while(x.hasNext())
  25.     {
  26.         std::cout << x.peekNext().uid << std::endl;
  27.         x.next();
  28.     }

  29.     // 使用只读迭代器遍历: 从后向前遍历
  30.     for(x.toBack();x.hasPrevious();x.previous())
  31.     {
  32.         std::cout << x.peekPrevious().uid << std::endl;

  33.     }

  34.     // 使用STL风格的迭代器遍历
  35.     QLinkedList<MyStruct>::iterator y;
  36.     for(y=ptr.begin();y!=ptr.end();++y)
  37.     {
  38.         std::cout << (*y).uid << std::endl;
  39.     }

  40.     // STL风格的只读迭代器
  41.     QLinkedList<MyStruct>::const_iterator z;
  42.     for(z=ptr.constBegin();z!=ptr.constEnd();++z)
  43.     {
  44.         std::cout <<((*z).uname).toStdString().data()<< std::endl;
  45.     }


  46.     // 使用读写迭代器: 动态生成列表,每次对二取余
  47.     QLinkedList<int> Number = {1,2,3,4,5,6,7,8,9,10};
  48.     QMutableLinkedListIterator<int> item(Number);

  49.     // --> 从前向后输出一次
  50.     for(item.toFront();item.hasNext();item.next())
  51.         std::cout << item.peekNext() << std::endl;

  52.     // --> 将指针移动到最后然后判断
  53.     for(item.toBack();item.hasPrevious();)
  54.     {
  55.         if(item.previous() % 2==0)
  56.             item.remove();
  57.         else
  58.             item.setValue(item.peekNext() * 10);
  59.     }
  60.     // --> 最后输出出相加后的结果
  61.     for(item.toFront();item.hasNext();)
  62.     {
  63.         std::cout << item.peekNext() << std::endl;
  64.         item.next();
  65.     }
  66.     return a.exec();
  67. }
复制代码



QVector: 该容器在相邻内存中存储连续的数据,该方式的使用与Qlist完全一致,但性能要比Qlist更高,但在插入时速度最慢。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QVector>
  4. #include <QVectorIterator>
  5. #include <QMutableVectorIterator>

  6. struct MyStruct
  7. {
  8.     qint32 uid;
  9.     QString uname;
  10. };

  11. int main(int argc, char *argv[])
  12. {
  13.     QCoreApplication a(argc, argv);

  14.     QVector<MyStruct> ptr;
  15.     MyStruct str_ptr;

  16.     str_ptr.uid = 1001;
  17.     str_ptr.uname = "admin";
  18.     ptr.append(str_ptr);

  19.     str_ptr.uid = 1002;
  20.     str_ptr.uname = "guest";
  21.     ptr.append(str_ptr);

  22.     // 使用传统方式遍历
  23.     for(qint32 x=0;x<ptr.count();x++)
  24.     {
  25.         std::cout << ptr.at(x).uid << std::endl;
  26.         std::cout << ptr[x].uname.toStdString().data() << std::endl;
  27.     }

  28.     // 使用只读迭代器遍历: C++ STL写法
  29.     QVector<MyStruct>::const_iterator item;
  30.     for(item = ptr.begin();item != ptr.end(); ++item)
  31.     {
  32.         std::cout << (*item).uid << std::endl;
  33.         std::cout << (*item).uname.toStdString().data() << std::endl;
  34.     }

  35.     // 使用读写迭代器修改: C++ STL写法
  36.     QVector<MyStruct>::iterator write_item;
  37.     for(write_item = ptr.begin();write_item !=ptr.end();++write_item)
  38.     {
  39.         if((*write_item).uid == 1001)
  40.         {
  41.             (*write_item).uname = "xxxx";
  42.         }
  43.         std::cout << (*write_item).uid << std::endl;
  44.         std::cout << (*write_item).uname.toStdString().data() << std::endl;
  45.     }

  46.     return a.exec();
  47. }
复制代码




QStack: qstack时堆栈结构先进后出。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QStack>
  5. #include <QQueue>

  6. struct MyStruct
  7. {
  8.     qint32 uid;
  9.     QString uname;
  10. };

  11. int main(int argc, char *argv[])
  12. {
  13.     QCoreApplication a(argc, argv);

  14.     // 定义并弹出QString类型数据
  15.     QStack<QString> stack;

  16.     stack.push("admin");
  17.     stack.push("guest");

  18.     std::cout << (stack.top()).toStdString().data()<<std::endl;
  19.     while(!stack.isEmpty())
  20.     {
  21.         std::cout << (stack.pop()).toStdString().data() << std::endl;
  22.     }

  23.     // 定义并弹出一个结构类型数据
  24.     QStack<MyStruct> struct_stack;
  25.     MyStruct ptr;

  26.     ptr.uid = 1001;
  27.     ptr.uname = "admin";
  28.     struct_stack.push(ptr);

  29.     ptr.uid = 1002;
  30.     ptr.uname = "guest";
  31.     struct_stack.push(ptr);

  32.     // 分别弹出数据并输出
  33.     while(!struct_stack.isEmpty())
  34.     {
  35.         MyStruct ref;

  36.         ref = struct_stack.pop();
  37.         std::cout << "uid = " << ref.uid << std::endl;
  38.         std::cout << "uname = " << ref.uname.toStdString().data() << std::endl;
  39.     }

  40.     return a.exec();
  41. }
复制代码



QQueue: qqueue 队列,先进先出。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QQueue>

  5. struct MyStruct
  6. {
  7.     qint32 uid;
  8.     QString uname;
  9. };

  10. int main(int argc, char *argv[])
  11. {
  12.     QCoreApplication a(argc, argv);

  13.     QQueue<MyStruct> ptr;
  14.     MyStruct queue_ptr;

  15.     // 实现对结构体的入队
  16.     queue_ptr.uid = 1001;
  17.     queue_ptr.uname = "admin";
  18.     ptr.enqueue(queue_ptr);

  19.     queue_ptr.uid = 1002;
  20.     queue_ptr.uname = "guest";
  21.     ptr.enqueue(queue_ptr);

  22.     // 实现对结构体的出队
  23.     while(!ptr.isEmpty())
  24.     {
  25.         MyStruct ref;

  26.         ref = ptr.dequeue();
  27.         std::cout << "uid = " << ref.uid << std::endl;
  28.         std::cout << "uname = " << ref.uname.toStdString().data() << std::endl;
  29.     }

  30.     return a.exec();
  31. }
复制代码


关联容器
关联容器: qmap,qmultimap,qhash,qmultihash,qmultihash,qset
qmap/qmultimap: 提供了一个字典类型的关联数组,一个键映射一个值,qmap是按照顺序存储的,如果不在意顺序可以使用qhash,使用qhash效率更高。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QtGlobal>
  5. #include <QMap>
  6. #include <QMapIterator>

  7. struct MyStruct
  8. {
  9.     qint32 uid;
  10.     QString uname;
  11. };

  12. int main(int argc, char *argv[])
  13. {
  14.     QCoreApplication a(argc, argv);

  15.     QMap<QString,QString> map;

  16.     map["1001"] = "admin";
  17.     map["1002"] = "guest";
  18.     map.insert("1003","lyshark");
  19.     map.insert("1004","lucy");
  20.     // map.remove("1002");

  21.     // 根据键值对查询属性
  22.     std::cout << map["1002"].toStdString().data() << std::endl;
  23.     std::cout << map.value("1003").toStdString().data() << std::endl;
  24.     std::cout << map.key("admin").toStdString().data() << std::endl;

  25.     // 使用STL语法迭代枚举Map键值对
  26.     QMap<QString,QString>::const_iterator x;
  27.     for(x=map.constBegin();x != map.constEnd(); ++x)
  28.     {
  29.         std::cout << x.key().toStdString().data() << " : ";
  30.         std::cout << x.value().toStdString().data() << std::endl;
  31.     }

  32.     // 使用STL语法实现修改键值对
  33.     QMap<QString,QString>::iterator write_x;
  34.     write_x = map.find("1003");
  35.     if(write_x !=map.end())
  36.         write_x.value()= "you ary in";

  37.     // 使用QTglobal中自带的foreach遍历键值对
  38.     QString each;

  39.     // --> 单循环遍历
  40.     foreach(const QString &each,map.keys())
  41.     {
  42.         std::cout << map.value(each).toStdString().data() << std::endl;
  43.     }

  44.     // --> 多循环遍历
  45.     foreach(const QString &each,map.uniqueKeys())
  46.     {
  47.         foreach(QString x,map.value(each))
  48.         {
  49.             std::cout << each.toStdString().data() << " : ";
  50.             std::cout << x.toStdString().data() << std::endl;
  51.         }
  52.     }

  53.     return a.exec();
  54. }
复制代码



qmultimap是qmap的子集,用于处理多值映射的类。

  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QList>
  5. #include <QMultiMap>


  6. struct MyStruct
  7. {
  8.     qint32 uid;
  9.     QString uname;
  10. };

  11. int main(int argc, char *argv[])
  12. {
  13.     QCoreApplication a(argc, argv);

  14.     QMultiMap<QString,QString> mapA,mapB,mapC,mapD;

  15.     mapA.insert("lyshark","1000");
  16.     mapA.insert("lyshark","2000");
  17.     mapB.insert("admin","3000");
  18.     mapB.insert("admin","4000");
  19.     mapC.insert("admin","5000");

  20.     // 获取到里面的所有key=lyshark的值
  21.     QList<QString> ref;

  22.     ref = mapA.values("lyshark");
  23.     for(int x=0;x<ref.size();++x)
  24.     {
  25.         std::cout << ref.at(x).toStdString().data() << std::endl;
  26.     }

  27.     // 两个key相同可相加后输出
  28.     mapD = mapB + mapC;

  29.     ref = mapD.values("admin");
  30.     for(int x=0;x<ref.size();x++)
  31.     {
  32.         std::cout << ref.at(x).toStdString().data() << std::endl;
  33.     }

  34.     return a.exec();
  35. }
复制代码



qhash使用上与qmap相同,但qhash效率更高,唯一的不同时qhash不排序,qmap自动排序.

qset: qset 集合容器,是基于散列表的集合模板,存储顺序不定,查找速度最快,内部使用qhash实现。

  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QSet>

  5. struct MyStruct
  6. {
  7.     qint32 uid;
  8.     QString uname;
  9. };

  10. int main(int argc, char *argv[])
  11. {
  12.     QCoreApplication a(argc, argv);

  13.     QSet<QString> set;

  14.     set << "dog" << "cat" << "tiger";

  15.     // 测试某值是否包含于集合
  16.     if(set.contains("cat"))
  17.     {
  18.         std::cout << "include" << std::endl;
  19.     }

  20.     return a.exec();
  21. }
复制代码



将qlist与qmap结合使用,实现嵌套 , 在qmap中存储一个qlist数据。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QtGlobal>
  5. #include <QList>
  6. #include <QMap>

  7. int main(int argc, char *argv[])
  8. {
  9.     QCoreApplication a(argc, argv);

  10.     QMap<QString,QList<float>> map;
  11.     QList<float> ptr;

  12.     // 指定第一组数据
  13.     ptr.append(10.1);
  14.     ptr.append(12.5);
  15.     ptr.append(22.3);
  16.     map["10:10"] = ptr;

  17.     // 指定第二组数据
  18.     ptr.clear();
  19.     ptr.append(102.2);
  20.     ptr.append(203.2);
  21.     ptr.append(102.1);
  22.     map["11:20"] = ptr;

  23.     // 输出所有的数据
  24.     QList<float> tmp;
  25.     foreach(QString each,map.uniqueKeys())
  26.     {
  27.         tmp = map.value(each);
  28.         std::cout << "Time: " << each.toStdString().data() << std::endl;
  29.         for(qint32 x=0;x<tmp.count();x++)
  30.         {
  31.             std::cout << tmp[x]<< std::endl;
  32.         }
  33.     }

  34.     return a.exec();
  35. }
复制代码




将两个qlist合并为一个qmap,将列表合并为一个字典。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QtGlobal>
  5. #include <QList>
  6. #include <QMap>

  7. int main(int argc, char *argv[])
  8. {
  9.     QCoreApplication a(argc, argv);

  10.     QList<QString> Header = {"MemTotal","MemFree","Cached","SwapTotal","SwapFree"};
  11.     QList<float> Values = {12.5,46.8,68,100.3,55.9,86.1};
  12.     QMap<QString,float> map;

  13.     // 将列表合并为一个字典
  14.     for(int x=0;x<Header.count();x++)
  15.     {
  16.         QString head = Header[x].toStdString().data();
  17.         float val = Values[x];
  18.         map[head] = val;
  19.     }

  20.     // 输出特定字典中的数据
  21.     std::cout << map.key(100.3).toStdString().data() << std::endl;
  22.     std::cout << map.value("SwapTotal") << std::endl;

  23.     return a.exec();
  24. }
复制代码



反之,将字典拆分为一个列表。
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QtGlobal>
  5. #include <QList>
  6. #include <QMap>

  7. void Display(QMap<QString,float> map)
  8. {
  9.     foreach(const QString &each,map.uniqueKeys())
  10.     {
  11.         std::cout << each.toStdString().data() << std::endl;
  12.         std::cout << map.value(each) << std::endl;
  13.     }
  14. }

  15. int main(int argc, char *argv[])
  16. {
  17.     QCoreApplication a(argc, argv);

  18.     QMap<QString,float> map;

  19.     map["MemTotal"] = 12.5;
  20.     map["MemFree"] = 32.1;
  21.     map["Cached"] = 19.2;

  22.     Display(map);

  23.     QList<QString> map_key;
  24.     QList<float> map_value;

  25.     // 分别存储起来
  26.     map_key = map.keys();
  27.     map_value = map.values();

  28.     // 输出所有的key值
  29.     for(int x=0;x<map_key.count();x++)
  30.     {
  31.         std::cout << map_key[x].toStdString().data() << std::endl;
  32.     }

  33.     // 输出所有的value值
  34.     for(int x=0;x<map_value.count();x++)
  35.     {
  36.         std::cout << map_value[x] << std::endl;
  37.     }

  38.     return a.exec();
  39. }
复制代码



排序结构体:
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QtGlobal>
  5. #include <QList>

  6. struct MyStruct
  7. {
  8.     int uuid;
  9.     QString uname;
  10. };

  11. void Display(QList<int> ptr)
  12. {
  13.     foreach(const int &each,ptr)
  14.         std::cout << each << " ";
  15.     std::cout << std::endl;
  16. }

  17. // 由大到小排列
  18. int compare(const int &infoA,const int &infoB)
  19. {
  20.     return infoA > infoB;
  21. }

  22. // 针对结构体的排序方法
  23. void devListSort(QList<MyStruct> *list)
  24. {
  25.     std::sort(list->begin(),list->end(),[](const MyStruct &infoA,const MyStruct &infoB)
  26.     {
  27.         return infoA.uuid < infoB.uuid;
  28.     });
  29. }

  30. int main(int argc, char *argv[])
  31. {
  32.     QCoreApplication a(argc, argv);

  33.     // 定义并对单一数组排序
  34.     QList<int> list = {56,88,34,61,79,82,34,67,88,1};
  35.     std::sort(list.begin(),list.end(),compare);
  36.     Display(list);

  37.     // 定义并对结构体排序
  38.     QList<MyStruct> list_struct;
  39.     MyStruct ptr;

  40.     ptr.uuid=1005;
  41.     ptr.uname="admin";
  42.     list_struct.append(ptr);

  43.     ptr.uuid=1002;
  44.     ptr.uname = "guest";
  45.     list_struct.append(ptr);

  46.     ptr.uuid = 1000;
  47.     ptr.uname = "lyshark";
  48.     list_struct.append(ptr);

  49.     devListSort(&list_struct);

  50.     for(int x=0;x< list_struct.count();x++)
  51.     {
  52.         std::cout << list_struct[x].uuid << " ---> ";
  53.         std::cout << list_struct[x].uname.toStdString().data() << std::endl;
  54.     }

  55.     return a.exec();
  56. }
复制代码



正则表达式模块:
  1. #include <QCoreApplication>
  2. #include <iostream>
  3. #include <QString>
  4. #include <QtGlobal>

  5. int main(int argc, char *argv[])
  6. {
  7.     QCoreApplication a(argc, argv);

  8.     // 返回绝对值
  9.     std::cout << qAbs(10.5) << std::endl;

  10.     // 返回较大者
  11.     std::cout << qMax(12,56) << std::endl;

  12.     // 返回较小者
  13.     std::cout << qMin(22,56) << std::endl;

  14.     // 返回随机数
  15.     double x=6.7,y=3.5;
  16.     int ref = qRound(x);
  17.     std::cout << ref << std::endl;

  18.     // 交换位置
  19.     qSwap(x,y);
  20.     std::cout << x << std::endl;

  21.     return a.exec();
  22. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表