我正在对QString执行一些操作来修剪它,但我不想影响原始字符串。我是Qt的新手,并且对使用各种QString函数的正确方法感到困惑,因为有些是const,有些则不是。到目前为止,这就是我所拥有的:
// this needs to be const so it doesn't get modified.
// code later on is depending on this QString being unchanged
const QString string = getString();
我需要调用的方法是QString::simplified()
,QString::remove()
和QString::trimmed()
。令人困惑的部分是正确的方法,因为simplified()
和trimmed()
是const
,但remove()
不是。// simplified() is a const function but no problem because I want a copy of it
QString copy = string.simplified();
// remove is non-const so it operates on the handle object, which is what I want
copy.remove( "foo:", Qt::CaseInsensitive );
// trimmed() is const, but I want it to affect the original
copy = copy.trimmed();
。请记住,我要复制原件并直接对副本进行修改,这就是我所拥有的:
copy = copy.trimmed()
使用{{1}}正确的方法处理此案例?这是否会实现我的目标,即为下次使用复制()?是否有更好的(更优雅,更高效,更Qtish)的方式来做到这一点?
我检查了QString Qt Documentation,但无法满意地回答这些问题。
答案 0 :(得分:2)
我认为答案仅仅是出于优化原因。
在幕后,
QString
使用隐式共享(copy-on-write)来减少内存使用并避免不必要的数据复制。这也有助于减少存储16位字符而不是8位字符的固有开销。
通常,当他们返回对修改后的字符串的引用以获得最终结果时,我将使用几个不同的。 (更优雅的方式......)
例如:
QString str = " Hello World\n!";
QString str2 = str.toLower().trimmed().simplified();
if(str2.contains("world !"))
{
qDebug() << str2 << "contains \"world !\"";
}
以下是隐式共享的更多内容:
http://qt-project.org/doc/qt-4.8/implicit-sharing.html
希望有所帮助。