【发布时间】:2013-08-16 05:28:00
【问题描述】:
我想有效地比较 QString 和 std::string 的(不)相等性。哪一种是最好的方法,可能不需要创建中间对象?
【问题讨论】:
-
QString 保存 unicode,std::string 可以是任何东西,所以如果不假设 std::string 的内容,这里没有直接定义“平等”的方法。
标签: c++ qt std stdstring qstring
我想有效地比较 QString 和 std::string 的(不)相等性。哪一种是最好的方法,可能不需要创建中间对象?
【问题讨论】:
标签: c++ qt std stdstring qstring
QString::fromStdString() 和 QString::toStdString() 浮现在脑海中,但是它们会创建字符串的临时副本,所以 afaik,如果您不想拥有临时对象,则必须自己编写此函数(尽管更重要的是效率是个问题)。
例子:
QString string="string";
std::string stdstring="string";
qDebug()<< (string.toStdString()==stdstring); // true
QString string="string";
std::string stdstring="std string";
qDebug()<< (str==QString::fromStdString(stdstring)); // false
顺便说一句,在qt5中,QString::toStdString()现在使用QString::toUtf8()进行转换,所以字符串的Unicode属性不会丢失(qt-project.org/doc/qt-5.0/qtcore/qstring. html#toStdString
【讨论】:
如果您绝对确定两个字符串仅包含拉丁字符,则可以在没有中间对象的情况下完成:
bool latinCompare(const QString& qstr, const std::string& str)
{
if( qstr.length() != (int)str.size() )
return false;
const QChar* qstrData = qstr.data();
for( int i = 0; i < qstr.length(); ++i ) {
if( qstrData[i].toLatin1() != str[i] )
return false;
}
return true;
}
否则您应该将std::string 解码为QString 并比较两个QStrings。
【讨论】: