Qt 库提供了一组通用的机遇模板的容器类,可以用来存储指定类型的项目。例如:需要一个QString类型大小可变的数组,可以使用QVector< QString >
Qt库的容器类跟STL中的容器差不多,如果了解STL,学习qt容器就照葫芦画瓢了。
顺序容器:**
- QList< T >:使用append()、prepend()在列表的两端添加项目;insert()在中间插。
- QLinkedList < T >:注意如果迭代器进行插入/删除操作后,迭代器失效。
- QVector< T >
- QStack< T >
- QQueue< T >
关联容器:
- QSet< T >
- QMap< Key, T >
- QMultiMap<Key, T>
- QHash<Key,T>
- QMultiHash<Key,T>
对于他们的使用,这里就不在阐述了,大家可在STL中学习,也可以在QT帮助文档查看。
大家可亲自测试:
#pragma execution_character_set("utf-8")
#include <QtCore/QCoreApplication>
#include <QList.h>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QList<QString> list;
list << "aa" << "bb" << "cc"; //插入项目
if (list[1] == "bb") //将"bb"变成"ab"
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"); //在尾部添加 //aa ab bc dd
list.prepend("AA"); //在头部添加 //AA aa ab bc dd
QString str = list.takeAt(2); //删除第三个项目
qDebug() << "删除了:" << str;
qDebug() << "now the list is:";
for (int i = 0; i < list.size(); ++i)
{
qDebug() << list.at(i) << " "; // AA aa bc dd
}
qDebug() << "在第1个位置前插入:Aa";
list.insert(1, "Aa");
for (int i = 0; i < list.size(); ++i)
{
qDebug() << list.at(i) << " "; // AA Aa aa bc dd
}
list.swap(1, 3); //交换1,3项目
qDebug() << "交换后";
for (int i = 0; i < list.size(); ++i)
{
qDebug() << list.at(i) << " "; // AA bc aa Aa dd
}
qDebug() << "包含aa???:" << " " << list.contains("aa"); //true or false
qDebug() << "aa的个数??:" << " " << list.count("aa");
return a.exec();
}
遍历容器
遍历容器的类型:
1. Java风格
-
[ 只读] :eg: QListIterator < T >
-
[读写] :eg: QMutableListIterator< T >
2. STL风格
-
[ 只读] :eg: QList< T >::const_iterator
-
[读写] :eg: QList< T > :: iterator
eg:下面以QList为例进行加讲解:
QList <QString> list;
list << "AA" << "BB" << "CC" << "DD";
QList<QString>::iterator i; //使用读写迭代器
qDebug() << "the list is:";
for (i = list.begin(); i != list.end(); ++i)
qDebug() << (*i).toLower(); //转为小写
foreach关键字
foreach是Qt向C++语言中添加的关键字,用来进行容器顺序遍历。
eg:
int main(int argc, char* argv[])
{
QCoreApplication a(argc, argv);
QList<QString> list;
list.insert(0, "aa");
list.insert(1, "bb");
list.insert(2, "cc");
list.insert(3, "dd");
qDebug() << "the list is:";
foreach(QString str, list)
qDebug() << str;
///---------------------
QMap<QString, int> map;//map中不允许有重复的键key
map.insert("Aa",1);
map.insert("Bb",2);
map.insert("Cc", 3);
qDebug() << "the map is:";
foreach(QString str, map.keys()) //从map中获取每一个键key
{
qDebug() << str << ":" << map.value(str); //输出对应的key:value
}
//-----------------------
QMultiMap<QString,int> mmap;
mmap.insert("first", 1);
mmap.insert("first", 3);
mmap.insert("second", 4);
mmap.insert("third", 5);
qDebug() << "the mmap is:";
QList<QString> keys = mmap.uniqueKeys(); //返回所有键的列表
foreach(QString str, keys) //遍历所有的键
{
foreach(int i, mmap.values(str)) //遍历键中的所有值 //mmap.values()返回类型的QList<T>
{
qDebug() << str << ":" << i;
}
}
return a.exec();
}
QString--------------------提供了一个Unicode字符串
1:隐式共享(/写时拷贝)
一个共享类由一个共享数据块的指针和数据组成,共享数据块包含了一个引用计数。
当隐式共享类使用**“=”**操作符时就是使用浅复制,而要进行修改时才进行深复制。
主要的 隐式共享类: QByte_Array、QCursor、QFont、QPixmap、QString、QUrl、QVariant 、所有的容器类等。
2:编辑操作
常用操作跟STL中的类似
- trimmed():除去空白字符(空白字符,不是空格)
- simplified():除去两端和中间的空白字符。
- QString::SkipEmptyParts//表示跳过空的条目;eg :str.split(“,” , QString:: SkipEmptyParts)//按照“,”划分多个子串。
- append() / prepend();在字符串后面/前面添加字符或者字符串
- replace():替换指定位置多个字符
eg:
qDebug() << QObject::tr("一下是编辑字符串操作:");
QString str = "hello";
qDebug() << QObject::tr("字符串大小:") << str.size();
str[0] = QChar('H');
qDebug() << QObject::tr("第一个字符:") << str[0];
str.append(" world");
qDebug() << QObject::tr("字符串:") << str;
str.replace(5, 1, "**");
str += "!!!!";
qDebug() << QObject::tr("字符串:") << str;
str = "hi\r\n\Qt! \n";
qDebug() << QObject::tr("字符串:") << str;
qDebug() << "------------------------------------";
QString str1 = str.trimmed(); //除去字符串两端的空白字符
qDebug() << QObject::tr("str1:") << str1;
QString str2 = str.simplified(); //除去字符串两端和中间多余的字符串
qDebug() << QObject::tr("str2:") << str2;
str = "h,e,ll,,o,,"; //按照“,”划分成多个子串
QStringList list = str.split(",", QString::SkipEmptyParts);
qDebug() << "list:" << list;
3:查询操作
- left(5)/right(5):查询左边/右边5个字符的字符串
- indexOf( “hh” ): 查询字符串" hh "的位置
- mid(2,3): 包含第2个字符以后3个字符的字符串
- startsWith(" he “) / endsWith(” he"): 判断字符串是否已 “he”开始 / 结尾
- contains( " hehe" ): 判断是否包含“hehe”字符串
4:转换操作
- toInt():字符串转整数
- toFloat(): 转浮点型
- touUpper(): 转大写
- toLower(): 转小写
- QString::number(num): 整数转为字符串
- arg():函数参数可以取代字符串中相应的 “%1”等标记
int age = 23;
QString name = "yafei";
QString str = "abc";
str = QString("name is %1,age is %2").arg(name).arg(age);
qDebug() << str; //结果是:name is yafei,age is 23
str = "%1 %2";
qDebug() << str.arg("%1f", "hello");//结果是“%1f hello”
qDebug() << str.arg("%1f").arg("hello"); //结果是hello %1f
qPrintable()函数
将字符串转换为 const char * 类。
输出字符串的时候总是有引号,所有可以用这个函数将引号去掉。