#AskCpp13 Qt 操作字符的类有哪些?QString、QByteArray、…,何时使用何种类,搞不清楚哇!!
Qt 字符串相关的类
类 | 说明 |
---|---|
QByteArray | Array of bytes |
QByteArrayList | List of byte arrays |
QByteArrayMatcher | Holds a sequence of bytes that can be quickly matched in a byte array |
QChar | 16-bit Unicode character |
QCollator | Compares strings according to a localized collation algorithm |
QCollatorSortKey | Can be used to speed up string collation |
QLatin1Char | 8-bit ASCII/Latin-1 character |
QLatin1String | Thin wrapper around an US-ASCII/Latin-1 encoded string literal |
QLocale | Converts between numbers and their string representations in various languages |
QStaticByteArrayMatcher | Compile-time version of QByteArrayMatcher |
QString | Unicode character string |
QStringList | List of strings |
QStringMatcher | Holds a sequence of characters that can be quickly matched in a Unicode string |
QStringRef | Thin wrapper around QString substrings |
QStringView | Unified view on UTF-16 strings with a read-only subset of the QString API |
QTextBoundaryFinder | Way of finding Unicode text boundaries in a string |
QTextStream | Convenient interface for reading and writing text |
QString & QByteArray
QString 的内部其实是以 QChar 存储,QChar 是一个 16 位的 Unicode 字符集。
QByteArray 的内部存储的是元数据(包括 ‘\0’)以及传统的 8 位以 ‘\0’ 结尾的字符串。
通常情况,用 QString 即可!以下两情况使用 QByteArray:
- 当你要处理元数据时
- 在内存紧张的时候,比较嵌入式系统中。
怎样高效的使用 QString?
直接说结论,具体解释可以去看 Using QString Effectively。
-
与 C 字符串的等号判断用 QLatin1String() 包裹。
// if (fruit == "apple") { … } // possibly hidden malloc if (fruit QLatin1String("apple")) { … } // fast and mentions encoding
-
操作 QString 时,尽量用 QStringRef 来获取 QString 部分引用。
-
调用 QString::append () 之前考虑用 QString::reserve() 来分配足够多的内存,调用完用 QString::squeeze() 来释放多余的内存。
Qt 文档中说,通常不需要调用这两个函数!只有在处理很长的字符串,且需要避免重复申请内存的时候才用到。
// 示例代码 QString result; int maxSize; bool condition; QChar nextChar; result.reserve(maxSize); while (condition) result.append(nextChar); result.squeeze();
-
字符串的连接用 “%” 代替 “+”。
// if (foo.startsWith("(" + type + ")")) if (foo.startsWith("(" % type % ")")) // 更快!前提是引用了头文件 #include <QStringBuilder>,或者在 pro 文件里添加宏 QT_USE_QSTRINGBUILDER,添加宏后 Qt 会自动将 “+” 当前 "%" 处理。
-
用 QStringMatcher 类进行字符串的快速匹配?
-
QStringLiteral() 宏能将字面交的字符串在编译器确定。
// hasAttribute takes a QString argument if (node.hasAttribute("http-contents-length")) //... if (node.hasAttribute(QStringLiteral(u"http-contents-length"))) //...
1 2 4 点可以牢记于心,随手做到。
参考
https://wiki.qt.io/Using_QString_Effectively
https://wiki.qt.io/Basics_of_String_Encoding
https://wiki.qt.io/Using_QByteArray
Qt 文档之《Classes for String Data》