QString类
QString是Qt框架中提供的字符串类,用于处理Unicode字符串。它提供了许多方便的方法和功能,可以进行字符串的连接、查找、替换、截取等操作。QString类的对象是可变的,可以在运行时修改字符串内容。
.
由以上引出一个知识点:Unicode字符集
Unicode字符集是一个全球通用的字符编码标准,旨在覆盖世界上所有的字符。它提供了一个唯一的字符代码点,用于表示各种语言、符号、标点符号、表情符号和特殊字符。Unicode字符集采用了固定长度的编码方案,其中最常用的是UTF-8、UTF-16和UTF-32。UTF-8是一种变长编码,用1到4个字节表示字符;UTF-16是一种定长或变长编码,用2或4个字节表示字符;UTF-32是一种定长编码,用4个字节表示字符。
Unicode字符集目前包含超过137,000个字符,覆盖了几乎所有的书写系统,包括各种语言、数学符号、货币符号、箭头、表情符号、图形符号等等。它还为每个字符提供了唯一的码点值,通常用前缀U+表示,后面跟着字符的十六进制表示。
例如,拉丁字母大写的字母"A"在Unicode字符集中的码点是U+0041,中文汉字"爱"的码点是U+7231。通过使用Unicode字符集,可以在不同的平台和程序之间共享和交换文本数据,确保字符的正确显示和处理。
QLatin1String类
QLatin1String是Qt框架中提供的常量字符串类,用于处理Latin1编码的字符串。它提供了一些特定于Latin1编码的优化,适用于只读的字符串操作。QLatin1String实际上是QString类的一个封装,可以有效地处理Latin1编码的字符串。
.
由以上引出一个知识点:Latin1编码
Latin1编码,也称为ISO-8859-1编码,是一种字符编码标准,用于表示拉丁字母的字母和符号。它是ISO/IEC 8859系列中的第一个标准,包含了西欧语言字符集。每个字符占用一个字节(8位),可以表示256个不同的字符。Latin1编码覆盖了美国英语、西班牙语、葡萄牙语、法语、德语、意大利语、荷兰语、瑞典语、挪威语、丹麦语等大部分欧洲语言字符。
在使用Latin1编码时,每个字符都有一个唯一的字节值,例如字母’A’的字节值是65,字母’a’的字节值是97,依此类推。
尽管Latin1编码被广泛使用,但它无法表示其他非拉丁字母字符,比如中文、日文或俄文等字符。为了解决这个问题,Unicode编码应运而生,它通过使用更多的字节位来表示更多的字符。
QStringLiteral宏
QStringLiteral是C++11中引入的编译时字符串字面量,用于在编译时创建QString对象。QStringLiteral可以实现更高效的字符串操作,因为它会在编译时将字符串转换为QString对象,避免了运行时的字符串拷贝和内存分配。
示例:展示效率
{
QString str = "helloworld";
int i = 0;
int nCount = 0;
QElapsedTimer timer;
timer.start();
while (i < 1000000) {
if(str == QString("helloworld") )
{
++nCount;
}
++i;
}
qDebug().noquote() << __FILE__ << __LINE__ << "QString 比较耗时:" << timer.elapsed();
}
{
QString str = "helloworld";
int i = 0;
int nCount = 0;
QElapsedTimer timer;
timer.start();
while (i < 1000000) {
if(str == QLatin1String("helloworld") )
{
++nCount;
}
++i;
}
qDebug().noquote() << __FILE__ << __LINE__ << "QLatin1String 比较耗时:" << timer.elapsed();
}
{
QString str = "helloworld";
int i = 0;
int nCount = 0;
QElapsedTimer timer;
timer.start();
while (i < 1000000) {
if(str == QStringLiteral("helloworld") )
{
++nCount;
}
++i;
}
qDebug().noquote() << __FILE__ << __LINE__ << "QStringLiteral 比较耗时:" << timer.elapsed();
}
结果输出
..\untitled16\mainwindow.cpp 26 QString 比较耗时: 437
..\untitled16\mainwindow.cpp 42 QLatin1String 比较耗时: 119
..\untitled16\mainwindow.cpp 58 QStringLiteral 比较耗时: 397
三者效率
在效率方面,QStringLiteral相对于QString在创建对象和内存分配方面更高效。
而QLatin1String(以及char*)在处理Latin1编码的字符串时可能更有效率,因为它们不涉及Unicode字符的转换和处理。
结论
综上所述,如果需要处理Unicode字符串或需要字符串的可变性,并且不需要关注字符串编码和内存管理,推荐使用QString。如果需要处理Latin1编码的常量字符串,并且希望获取更高的效率,可以考虑使用QLatin1String。而如果在编译时已知字符串内容,并且追求最高的效率,可以使用QStringLiteral。
①参数能使用const char*类型或QLatin1String类型的地方使用相应的参数。
.
②参数需要QString参数类型的地方,若值不修改,则使用QStringLiteral宏
.
③参数需要QString类型且QString可能被修改,则直接使用QString或隐式转换。