Voglio confrontare in modo efficiente un QString e una stringa std :: per l'uguaglianza (in). Qual è il modo migliore per farlo, possibilmente senza creare oggetti intermedi?confrontare in modo efficiente QString e std :: string per l'uguaglianza
risposta
QString::fromStdString()
e QString::toStdString()
vengono in mente, ma creano una copia temporanea della stringa, quindi afaik, se non si desidera avere oggetti temporanei, si dovrà scrivere questa funzione da soli (anche se ciò che è più efficiente è un domanda).
Esempio:
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
proposito in QT5, QString::toStdString()
ora utilizza QString::toUtf8()
per eseguire la conversione, quindi le proprietà Unicode della stringa non verrà persa (qt-project.org/doc/qt- 5.0/qtcore/qstring.html # toStdString
La prima opzione, (string.toStdString() == stdstring), ha causato una perdita di memoria su Windows su ARM (non un problema di desktop o Linux). La seconda opzione, (str == QString :: fromStdString (stdstring)), funziona correttamente. – pixelgrease
può essere fatto senza oggetti intermedi, se si è assolutamente sicuri che le due stringhe contengono solo caratteri latini:
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;
}
Altrimenti dovresti decodificare lo std::string
in un QString
e confrontare i due QStrings
.
Quindi, invece di convertire l'intera stringa in una volta, si effettua la conversione tramite toLatin1() char per char. Suppongo che sia meno efficiente, ma se qualcuno si preoccupa di profilarlo, sarei interessato ai numeri. –
Guardando aLatin1_helper in qstring.cpp, la conversione completa della stringa deve iterare su ogni char nella stringa comunque, oltre ad allocare un QByteArray. D'altra parte, il controllo di uguaglianza è quindi un memcmp, e c'è un percorso ottimizzato per SSE2 che farebbe la differenza (questo è in 4.7.2 che è quello che ho a portata di mano così potrebbe essere cambiato). La mia versione può essere ottimizzata usando QString :: data() per ottenere un QChar *. Stavo principalmente cercando di raggiungere l'obiettivo di evitare allocazioni temporanee, ma non ho idea se sarebbe più veloce in questo caso. –
QString contiene unicode, std :: string può essere qualsiasi cosa, quindi non esiste un modo semplice per definire "l'uguaglianza" qui senza presupposti sul contenuto di std :: string. –