Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有效地比较QString和std::string是否相等_C++_Qt_Std_Stdstring_Qstring - Fatal编程技术网

C++ 有效地比较QString和std::string是否相等

C++ 有效地比较QString和std::string是否相等,c++,qt,std,stdstring,qstring,C++,Qt,Std,Stdstring,Qstring,我想有效地比较QString和std::string的(in)相等性。在不创建中间对象的情况下,哪种方法是最好的呢?QString::fromStdString()和QString::toststring(),但是它们会创建字符串的临时副本,因此,如果您不想拥有临时对象,您必须自己编写此函数(尽管效率更高的是一个问题) 例如: QString string="string"; std::string stdstring="string"; qDebug()<<

我想有效地比较QString和std::string的(in)相等性。在不创建中间对象的情况下,哪种方法是最好的呢?

QString::fromStdString()和
QString::toststring()
,但是它们会创建字符串的临时副本,因此,如果您不想拥有临时对象,您必须自己编写此函数(尽管效率更高的是一个问题)

例如:

    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
QString string=“string”;
std::string stdstring=“string”;

qDebug()如果您完全确定两个字符串只包含拉丁字符,则可以在没有中间对象的情况下执行此操作:

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;
}
bool拉丁比较(const-QString&qstr,const-std::string&str)
{
如果(qstr.length()!=(int)str.size())
返回false;
常量QChar*qstrData=qstr.data();
对于(int i=0;i

否则,您应该将
std::string
解码为
QString
,并比较这两个
QString

,因此,您可以通过toLatin1()进行转换,而不是一次转换整个字符串逐字符。我假设这效率较低,但如果有人想分析它,我会对数字感兴趣。看看qstring.cpp中的toLatin1_助手,完整的字符串转换必须迭代字符串中的每个字符,再加上分配一个QByteArray。另一方面,相等检查是一个memcmp,并且有一个优化的SSE2的路径会有所不同(这在4.7.2中,这是我手头的,所以可能已经更改了)。我的版本可以通过使用QString::data()进行优化为了得到一个QChar*。我主要是为了达到避免临时分配的目标,但我不知道在这种情况下这是否会更快。QString使用unicode,std::string可以是任何东西,因此如果不假设std::string的内容,就无法直接定义“相等”。第一个选项,(string.toStdString()==stdstring),导致ARM上的Windows内存泄漏(不是桌面或Linux问题)。第二个选项(str==QString::fromStdString(stdstring))工作正常。