2013-08-14 11 views
5

Ich möchte ein QString und std effizient vergleichen :: string für (in) Gleichheit. Was ist der beste Weg dies zu tun, möglicherweise ohne Zwischenobjekte zu erstellen?effizient vergleichen QString und std :: string für die Gleichstellung

+4

QString hält Unicode, std :: string kann alles sein, so gibt es keinen geraden Weg „Gleichheit“ hier ohne Annahmen über den Inhalt der std :: string definieren. –

Antwort

0

QString::fromStdString() und QString::toStdString() kommt in den Sinn, aber sie erstellen temporäre Kopie der Zeichenfolge, so afaik, wenn Sie keine temporären Objekte haben möchten, müssen Sie diese Funktion selbst schreiben (obwohl das, was effizienter ist a Frage).

Beispiel:

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 

Durch die Art und Weise in QT5 verwendet QString::toStdString() jetzt QString::toUtf8() die Umwandlung durchzuführen, so dass die Unicode-Eigenschaften der Zeichenfolge nicht verloren (qt-project.org/doc/qt- 5.0/QtCore/qstring.html # toStdString

+0

Die erste Option, (string.toStdString() == stdstring), verursacht ein Leck Speicher unter Windows auf ARM (kein Desktop oder Linux Ausgabe). Die zweite Option, (str == QString :: fromStdString (stdstring)), funktioniert gut. – pixelgrease

0

Es kann ohne Zwischen Objekte durchgeführt werden, wenn Sie sich absolut sicher sind, dass die beiden Strings nur lateinische Zeichen enthalten:

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; 
} 

Andernfalls sollten Sie die std::string in eine QString dekodieren und die zwei QStrings vergleichen.

+1

Anstatt also den gesamten String auf einmal zu konvertieren, führen Sie die Konvertierung über toLatin1() char durch char durch. Ich würde annehmen, dass das weniger effizient ist, aber wenn jemand interessiert ist, es zu profilieren, würde mich Zahlen interessieren. –

+0

Mit Blick auf toLatin1_helper in qstring.cpp, der vollständige String-Konvertierung muss sowieso jedes Zeichen im String iterieren, sowie eine QByteArray zuordnet. Auf der anderen Seite ist die Gleichheitsprüfung dann ein Memcmp, und es gibt einen optimierten Pfad für SSE2, der einen Unterschied machen würde (dies ist in 4.7.2, was ich praktisch habe, könnte sich also geändert haben). Meine Version kann mithilfe von QString :: data() optimiert werden, um einen QChar * zu erhalten. Ich habe hauptsächlich versucht, das Ziel zu erreichen, temporäre Zuteilungen zu vermeiden, aber ich habe keine Ahnung, ob das in diesem Fall schneller wäre. –