9

我想有效地比较 QString 和 std::string 的(不)相等性。哪个是最好的方法,可能不创建中间对象?

4

2 回答 2

5

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

于 2013-08-14T10:39:03.207 回答
0

如果您绝对确定两个字符串仅包含拉丁字符,则无需中间对象即可完成:

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::stringa解码QString并比较两者QStrings

于 2013-08-14T11:48:36.640 回答