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. –
- 1. Come convertire QString in std :: string?
- 2. vantaggio di QString su std :: string
- 3. Il modo migliore per confrontare std :: stringhe
- 4. Il modo migliore per convertire std :: wstring in QString
- 5. Differenza tra std: string e std :: string
- 6. Come confrontare in modo efficiente gli insiemi in C++?
- 7. Modo pulito per convertire Python 3 Unicode in std :: string
- 8. Cython C++ e std :: string
- 9. std :: string :: iterator per offset e back
- 10. SWIG: come avvolgere std :: string & (std :: string passato per riferimento)
- 11. C'è un modo per std :: move std :: string in std :: stringstream
- 12. equivalente strncpy per std :: string?
- 13. std :: string :: c_str() e provvisori
- 14. ordinamento dipendente dalla locale per std :: string
- 15. Converti bool in QString
- 16. Come trasformare System :: String^in std :: string?
- 17. C++ std :: string su booleano
- 18. Rimuovere in modo efficiente l'ultimo elemento da std :: list
- 19. Un modo efficiente per confrontare un valore NULL o un valore per una colonna in SQL
- 20. Modo efficiente di iterare su bit true in std :: bitset?
- 21. in che modo std :: string gestisce questo trucco?
- 22. Posso fare in modo che std :: string usi meno memoria?
- 23. come confrontare due std :: set?
- 24. convertire std :: string in basic_ostream?
- 25. std :: string e Unicode codificato UTF-8
- 26. Perché non è std :: string :: max_size() == std :: string :: allocator :: max_size()
- 27. Come confrontare due elenchi di grandi dimensioni in modo efficiente in C#?
- 28. std :: string o std :: vector per conservare i dati grezzi
- 29. Qual è il modo più efficiente per manipolare una matrice dinamica 2D di std :: string nella memoria?
- 30. Confrontando carattere letterale di std :: string in C++
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. –