【问题标题】:efficiently compare QString and std::string for equality有效地比较 QString 和 std::string 是否相等
【发布时间】:2013-08-16 05:28:00
【问题描述】:

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

【问题讨论】:

  • QString 保存 unicode,std::string 可以是任何东西,所以如果不假设 std::string 的内容,这里没有直接定义“平等”的方法。

标签: c++ qt std stdstring qstring


【解决方案1】:

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

【讨论】:

  • 第一个选项 (string.toStdString()==stdstring) 在 ARM 上的 Windows 上导致内存泄漏(不是桌面或 Linux 问题)。第二个选项 (str==QString::fromStdString(stdstring)) 工作正常。
【解决方案2】:

如果您绝对确定两个字符串仅包含拉丁字符,则可以在没有中间对象的情况下完成:

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

【讨论】:

  • 因此,您可以通过 toLatin1() 逐个字符地转换整个字符串,而不是一次转换整个字符串。我认为这效率较低,但如果有人愿意分析它,我会对数字感兴趣。
  • 查看 qstring.cpp 中的 toLatin1_helper,无论如何,完整的字符串转换必须遍历字符串中的每个字符,并分配一个 QByteArray。另一方面,相等性检查是一个 memcmp,并且有一个 SSE2 的优化路径会有所作为(这是在 4.7.2 中,这是我方便的,所以可能已经改变了)。我的版本可以通过使用 QString::data() 来优化以获得 QChar*。我主要是试图实现避免临时分配的目标,但我不知道在这种情况下是否会更快。
猜你喜欢
  • 2015-03-13
  • 2010-12-05
  • 2015-02-16
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2012-08-31
  • 2015-05-12
相关资源
最近更新 更多