QT是一个跨平台的图形化类库,常用数据结构就是对C++ STL的二次封装,使其更加易用,如下是经常会用到的一些数据结构和算法笔记。
字符串容器
QString 追加/删除:
#include <QCoreApplication> #include <iostream> #include <QChar> #include <QString>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QString Str1 = "hello", Str2 = "lyshark",temp; temp = Str1 + Str2;
std::cout << temp.toStdString().data() << std::endl; std::cout << (Str1+Str2).toStdString().data() << std::endl;
QString Str3 = "hello "; Str3.append("lyshark"); Str3.push_back("test"); Str3.remove("hello"); Str3.prepend("-->"); std::cout << Str3.toStdString().data() << std::endl;
QString Str4; Str4.sprintf("%s %s","Welcome","to you !"); std::cout << Str4.toStdString().data() << std::endl;
QString Str5; Str5 = QString("%1 is age = %2 . ").arg("lyshark").arg("24"); std::cout << Str5.toStdString().data() << std::endl; std::cout << (QString("1") + QChar('A')).toStdString().data() << std::endl; std::cout << (QString("2") + QString('B')).toStdString().data() << std::endl;
std::cout << Str5.count() << std::endl; std::cout << Str5.size() << std::endl; std::cout << Str5.length() << std::endl;
QString Str6 = " hello lyshark welcome ! "; Str6 = Str6.trimmed(); Str6 = Str6.simplified(); std::cout << Str6.toStdString().data() << std::endl;
Str6 = Str6.mid(2,10); std::cout << Str6.toStdString().data() << std::endl;
std::cout << (QString("123456").remove(1,3)).toStdString().data() << std::endl;
std::cout << (QString("abcdefg").leftJustified(11,'.',true)).toStdString().data() << std::endl;
std::cout << (QString::number(100,16)).toStdString().data() << std::endl;
std::cout << (QString("0%1").arg(123,8,16,QLatin1Char('0'))).toStdString().data() << std::endl;
std::cout << QString("0%1").arg(QString::number(100,8)).toStdString().data() << std::endl; std::cout << (QString("0%1").arg(QString::number(.777,'f',1))).toStdString().data() << std::endl;
std::cout << (QString("1,2,3,4,5,6").split(',')[2]).toStdString().data() << std::endl;
QByteArray byte;
byte.resize(2); byte[0]='1'; byte[1]='2'; QString strs = byte;
return a.exec(); }
|
QString 查询/替换: 字符串的查询,替换,扫描与切割。
#include <QCoreApplication> #include <iostream> #include <QString>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QString str = "hello lyshark welcome admin"; int index; bool ref;
ref = str.contains("lyshark",Qt::CaseInsensitive); std::cout << ref << std::endl;
ref = str.contains("LYSHARK",Qt::CaseSensitive); std::cout << ref << std::endl;
ref = str.startsWith("hello",Qt::CaseInsensitive); std::cout << ref << std::endl;
ref = str.endsWith("lyshark",Qt::CaseSensitive); std::cout << ref << std::endl;
index = str.indexOf(" "); std::cout << str.left(index).toStdString().data()<< std::endl;
index = str.lastIndexOf(" "); std::cout << str.right(str.size() - index - 1).toStdString().data() << std::endl;
str = str.replace("lyshark","admin"); std::cout << str.toStdString().data() << std::endl;
QString str2 = "uname,uage,usex"; std::cout << str2.section(",",0,0).toStdString().data() << std::endl; std::cout << str2.section(",",1,1).toStdString().data() << std::endl;
QString str3 ="192.168.1.10"; std::cout << str3.left(str3.indexOf(".")).toStdString().data() << std::endl; std::cout << str3.mid(str3.indexOf(".")+1,3).toStdString().data() << std::endl; std::cout << str3.mid(str3.indexOf(".")+1,1).toStdString().data() << std::endl; std::cout << str3.right(str3.size() - (str3.lastIndexOf(".")+1)).toStdString().data() << std::endl;
QString str4,str5=""; std::cout << str4.isNull() << std::endl; std::cout << str5.isNull() << std::endl; std::cout << str5.isEmpty() << std::endl;
return a.exec(); }
|
QString 字符串转换:
#include <QCoreApplication> #include <iostream> #include <QString> #include <QByteArray>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QString str = "uname,uage,usex"; QString int_str = "100,200,300";
str = str.toUpper(); std::cout << str.toStdString().data() << std::endl; str = str.toLower(); std::cout << str.toStdString().data() << std::endl;
bool flag = false; QString x = int_str.section(",",0,0);
int dec = x.toInt(&flag,10); std::cout << dec << std::endl;
int hex = x.toUInt(&flag,16); std::cout << hex << std::endl;
int number = 100; QString number_str;
number_str = number_str.setNum(number,16); std::cout << number_str.toStdString().data() << std::endl;
QString str_string = "welcome to you !";
QByteArray ba = str_string.toUtf8(); std::cout << ba.toStdString().data() << std::endl;
float total = 3.1415926; QString str_total;
str_total = str_total.sprintf("%.4f",total); std::cout << str_total.toStdString().data() << std::endl;
str_total = QString::asprintf("%2f",total); std::cout << str_total.toStdString().data() << std::endl;
return a.exec(); }
|
顺序容器
顺序容器 QList,QLinkedList,QVector,QStack,QQueue
qlist: 顺序容器,qlist是以下表的方式对数据进行访问的,可以使用下表索引的方式访问特定数据。
#include <QCoreApplication> #include <iostream> #include <QList>
void Display(QList<QString> &ptr) { std::cout << "-----------------------------" << std::endl; for(qint32 x=0;x<ptr.count();x++) { std::cout << (ptr.at(x)).toStdString().data() << std::endl; } std::cout << std::endl; }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QList<QString> StringPtrA; QList<QString> StringPtrB;
StringPtrA.append("admin"); StringPtrA.append("guest"); StringPtrA.append("lyshark"); Display(StringPtrA);
StringPtrA.prepend("hanter"); Display(StringPtrA);
StringPtrA.insert(0,QString("lucy")); Display(StringPtrA);
StringPtrA.replace(1,"Administrator"); Display(StringPtrA);
StringPtrA.removeAt(0); Display(StringPtrA);
StringPtrA.removeFirst(); StringPtrA.removeLast();
StringPtrA.move(0,1); Display(StringPtrA);
StringPtrB = {"youtube","facebook"}; StringPtrA.swap(StringPtrB); Display(StringPtrA); return a.exec(); }
|
qlist可以指定一个struct结构进行数据操作.
#include <QCoreApplication> #include <iostream> #include <QList> #include <QListIterator> #include <QMutableListIterator>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QList<MyStruct> ptr; MyStruct str_ptr;
str_ptr.uid = 1001; str_ptr.uname = "admin"; ptr.append(str_ptr);
str_ptr.uid = 1002; str_ptr.uname = "guest"; ptr.append(str_ptr);
for(qint32 x=0;x<ptr.count();x++) { std::cout << ptr.at(x).uid << std::endl; std::cout << ptr[x].uname.toStdString().data() << std::endl; }
QListIterator<MyStruct> x(ptr); while(x.hasNext()) { std::cout << x.peekNext().uid << std::endl; std::cout << (x.peekNext().uname).toStdString().data() << std::endl; x.next(); }
QMutableListIterator<MyStruct> y(ptr); while(y.hasNext()) { if(y.peekNext().uid == 1002) { y.peekNext().uname = "lyshark"; } y.next(); } return a.exec(); }
|
qlinklist: qlinklist就是动态链表结构,数据的存储非连续,访问时无法直接使用下标定位,只能通过迭代器迭代寻找,参数定义与qlist基本一致。
#include <QCoreApplication> #include <iostream> #include <QLinkedList> #include <QLinkedListIterator> #include <QMutableLinkedListIterator>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QLinkedList<MyStruct> ptr; MyStruct str_ptr;
str_ptr.uid = 1001; str_ptr.uname = "admin"; ptr.append(str_ptr);
str_ptr.uid = 1002; str_ptr.uname = "guest"; ptr.append(str_ptr);
QLinkedListIterator<MyStruct> x(ptr); while(x.hasNext()) { std::cout << x.peekNext().uid << std::endl; x.next(); }
for(x.toBack();x.hasPrevious();x.previous()) { std::cout << x.peekPrevious().uid << std::endl;
}
QLinkedList<MyStruct>::iterator y; for(y=ptr.begin();y!=ptr.end();++y) { std::cout << (*y).uid << std::endl; }
QLinkedList<MyStruct>::const_iterator z; for(z=ptr.constBegin();z!=ptr.constEnd();++z) { std::cout <<((*z).uname).toStdString().data()<< std::endl; }
QLinkedList<int> Number = {1,2,3,4,5,6,7,8,9,10}; QMutableLinkedListIterator<int> item(Number);
for(item.toFront();item.hasNext();item.next()) std::cout << item.peekNext() << std::endl;
for(item.toBack();item.hasPrevious();) { if(item.previous() % 2==0) item.remove(); else item.setValue(item.peekNext() * 10); } for(item.toFront();item.hasNext();) { std::cout << item.peekNext() << std::endl; item.next(); } return a.exec(); }
|
QVector: 该容器在相邻内存中存储连续的数据,该方式的使用与Qlist完全一致,但性能要比Qlist更高,但在插入时速度最慢。
#include <QCoreApplication> #include <iostream> #include <QVector> #include <QVectorIterator> #include <QMutableVectorIterator>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QVector<MyStruct> ptr; MyStruct str_ptr;
str_ptr.uid = 1001; str_ptr.uname = "admin"; ptr.append(str_ptr);
str_ptr.uid = 1002; str_ptr.uname = "guest"; ptr.append(str_ptr);
for(qint32 x=0;x<ptr.count();x++) { std::cout << ptr.at(x).uid << std::endl; std::cout << ptr[x].uname.toStdString().data() << std::endl; }
QVector<MyStruct>::const_iterator item; for(item = ptr.begin();item != ptr.end(); ++item) { std::cout << (*item).uid << std::endl; std::cout << (*item).uname.toStdString().data() << std::endl; }
QVector<MyStruct>::iterator write_item; for(write_item = ptr.begin();write_item !=ptr.end();++write_item) { if((*write_item).uid == 1001) { (*write_item).uname = "xxxx"; } std::cout << (*write_item).uid << std::endl; std::cout << (*write_item).uname.toStdString().data() << std::endl; }
return a.exec(); }
|
QStack: qstack时堆栈结构先进后出。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QStack> #include <QQueue>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QStack<QString> stack;
stack.push("admin"); stack.push("guest");
std::cout << (stack.top()).toStdString().data()<<std::endl; while(!stack.isEmpty()) { std::cout << (stack.pop()).toStdString().data() << std::endl; }
QStack<MyStruct> struct_stack; MyStruct ptr;
ptr.uid = 1001; ptr.uname = "admin"; struct_stack.push(ptr);
ptr.uid = 1002; ptr.uname = "guest"; struct_stack.push(ptr);
while(!struct_stack.isEmpty()) { MyStruct ref;
ref = struct_stack.pop(); std::cout << "uid = " << ref.uid << std::endl; std::cout << "uname = " << ref.uname.toStdString().data() << std::endl; }
return a.exec(); }
|
QQueue: qqueue 队列,先进先出。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QQueue>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QQueue<MyStruct> ptr; MyStruct queue_ptr;
queue_ptr.uid = 1001; queue_ptr.uname = "admin"; ptr.enqueue(queue_ptr);
queue_ptr.uid = 1002; queue_ptr.uname = "guest"; ptr.enqueue(queue_ptr);
while(!ptr.isEmpty()) { MyStruct ref;
ref = ptr.dequeue(); std::cout << "uid = " << ref.uid << std::endl; std::cout << "uname = " << ref.uname.toStdString().data() << std::endl; }
return a.exec(); }
|
关联容器
关联容器: qmap,qmultimap,qhash,qmultihash,qmultihash,qset
qmap/qmultimap: 提供了一个字典类型的关联数组,一个键映射一个值,qmap是按照顺序存储的,如果不在意顺序可以使用qhash,使用qhash效率更高。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QtGlobal> #include <QMap> #include <QMapIterator>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QMap<QString,QString> map;
map["1001"] = "admin"; map["1002"] = "guest"; map.insert("1003","lyshark"); map.insert("1004","lucy");
std::cout << map["1002"].toStdString().data() << std::endl; std::cout << map.value("1003").toStdString().data() << std::endl; std::cout << map.key("admin").toStdString().data() << std::endl;
QMap<QString,QString>::const_iterator x; for(x=map.constBegin();x != map.constEnd(); ++x) { std::cout << x.key().toStdString().data() << " : "; std::cout << x.value().toStdString().data() << std::endl; }
QMap<QString,QString>::iterator write_x; write_x = map.find("1003"); if(write_x !=map.end()) write_x.value()= "you ary in";
QString each;
foreach(const QString &each,map.keys()) { std::cout << map.value(each).toStdString().data() << std::endl; }
foreach(const QString &each,map.uniqueKeys()) { foreach(QString x,map.value(each)) { std::cout << each.toStdString().data() << " : "; std::cout << x.toStdString().data() << std::endl; } }
return a.exec(); }
|
qmultimap是qmap的子集,用于处理多值映射的类。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QList> #include <QMultiMap>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QMultiMap<QString,QString> mapA,mapB,mapC,mapD;
mapA.insert("lyshark","1000"); mapA.insert("lyshark","2000"); mapB.insert("admin","3000"); mapB.insert("admin","4000"); mapC.insert("admin","5000");
QList<QString> ref;
ref = mapA.values("lyshark"); for(int x=0;x<ref.size();++x) { std::cout << ref.at(x).toStdString().data() << std::endl; }
mapD = mapB + mapC;
ref = mapD.values("admin"); for(int x=0;x<ref.size();x++) { std::cout << ref.at(x).toStdString().data() << std::endl; }
return a.exec(); }
|
qhash使用上与qmap相同,但qhash效率更高,唯一的不同时qhash不排序,qmap自动排序.
qset: qset 集合容器,是基于散列表的集合模板,存储顺序不定,查找速度最快,内部使用qhash实现。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QSet>
struct MyStruct { qint32 uid; QString uname; };
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QSet<QString> set;
set << "dog" << "cat" << "tiger";
if(set.contains("cat")) { std::cout << "include" << std::endl; }
return a.exec(); }
|
将qlist与qmap结合使用,实现嵌套 , 在qmap中存储一个qlist数据。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QtGlobal> #include <QList> #include <QMap>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QMap<QString,QList<float>> map; QList<float> ptr;
ptr.append(10.1); ptr.append(12.5); ptr.append(22.3); map["10:10"] = ptr;
ptr.clear(); ptr.append(102.2); ptr.append(203.2); ptr.append(102.1); map["11:20"] = ptr;
QList<float> tmp; foreach(QString each,map.uniqueKeys()) { tmp = map.value(each); std::cout << "Time: " << each.toStdString().data() << std::endl; for(qint32 x=0;x<tmp.count();x++) { std::cout << tmp[x]<< std::endl; } }
return a.exec(); }
|
将两个qlist合并为一个qmap,将列表合并为一个字典。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QtGlobal> #include <QList> #include <QMap>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QList<QString> Header = {"MemTotal","MemFree","Cached","SwapTotal","SwapFree"}; QList<float> Values = {12.5,46.8,68,100.3,55.9,86.1}; QMap<QString,float> map;
for(int x=0;x<Header.count();x++) { QString head = Header[x].toStdString().data(); float val = Values[x]; map[head] = val; }
std::cout << map.key(100.3).toStdString().data() << std::endl; std::cout << map.value("SwapTotal") << std::endl;
return a.exec(); }
|
反之,将字典拆分为一个列表。
#include <QCoreApplication> #include <iostream> #include <QString> #include <QtGlobal> #include <QList> #include <QMap>
void Display(QMap<QString,float> map) { foreach(const QString &each,map.uniqueKeys()) { std::cout << each.toStdString().data() << std::endl; std::cout << map.value(each) << std::endl; } }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QMap<QString,float> map;
map["MemTotal"] = 12.5; map["MemFree"] = 32.1; map["Cached"] = 19.2;
Display(map);
QList<QString> map_key; QList<float> map_value;
map_key = map.keys(); map_value = map.values();
for(int x=0;x<map_key.count();x++) { std::cout << map_key[x].toStdString().data() << std::endl; }
for(int x=0;x<map_value.count();x++) { std::cout << map_value[x] << std::endl; }
return a.exec(); }
|
排序结构体:
#include <QCoreApplication> #include <iostream> #include <QString> #include <QtGlobal> #include <QList>
struct MyStruct { int uuid; QString uname; };
void Display(QList<int> ptr) { foreach(const int &each,ptr) std::cout << each << " "; std::cout << std::endl; }
int compare(const int &infoA,const int &infoB) { return infoA > infoB; }
void devListSort(QList<MyStruct> *list) { std::sort(list->begin(),list->end(),[](const MyStruct &infoA,const MyStruct &infoB) { return infoA.uuid < infoB.uuid; }); }
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
QList<int> list = {56,88,34,61,79,82,34,67,88,1}; std::sort(list.begin(),list.end(),compare); Display(list);
QList<MyStruct> list_struct; MyStruct ptr;
ptr.uuid=1005; ptr.uname="admin"; list_struct.append(ptr);
ptr.uuid=1002; ptr.uname = "guest"; list_struct.append(ptr);
ptr.uuid = 1000; ptr.uname = "lyshark"; list_struct.append(ptr);
devListSort(&list_struct);
for(int x=0;x< list_struct.count();x++) { std::cout << list_struct[x].uuid << " ---> "; std::cout << list_struct[x].uname.toStdString().data() << std::endl; }
return a.exec(); }
|
正则表达式模块:
#include <QCoreApplication> #include <iostream> #include <QString> #include <QtGlobal>
int main(int argc, char *argv[]) { QCoreApplication a(argc, argv);
std::cout << qAbs(10.5) << std::endl;
std::cout << qMax(12,56) << std::endl;
std::cout << qMin(22,56) << std::endl;
double x=6.7,y=3.5; int ref = qRound(x); std::cout << ref << std::endl;
qSwap(x,y); std::cout << x << std::endl;
return a.exec(); }
|