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
Antwort
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
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
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.
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. –
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. –
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. –