효율적으로 QString과 std :: string을 (를) 동등하게 비교하려고합니다. 중간 개체를 만들지 않고 가장 좋은 방법은 무엇입니까?QString과 std :: string의 동등성을 효율적으로 비교하십시오.
답변
QString::fromStdString()
및 QString::toStdString()
은 마음에 온다, 그러나 그들은 임시 개체가하지 않으려면 더 효율적입니다 무엇 비록, 당신이 (이 함수를 직접 작성해야합니다, AFAIK 문자열의 임시 복사본을 만들고, 그래서 문제).
예 : qt-project.org/doc/qt- (qt5의 방법으로
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::toStdString()
이제 변환을 수행 QString::toUtf8()
를 사용하므로 문자열의 유니 코드 속성이 손실되지 않습니다 5.0/qtcore/qstring.html #의 toStdString
첫 번째 옵션 인 (string.toStdString() == stdstring)으로 인해 Windows에서 ARM의 누수 메모리가 발생했습니다 (데스크톱 또는 Linux 문제가 아님). 두 번째 옵션 (str == QString :: fromStdString (stdstring))은 정상적으로 작동합니다. – pixelgrease
:
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;
}
그렇지 않으면 std::string
을 QString
으로 디코딩하여 두 QStrings
을 비교해야합니다.
그래서 전체 문자열을 한 번에 변환하는 대신 char을 사용하여 toLatin1() char을 통해 변환을 수행합니다. 나는 그것이 덜 효율적이라고 생각 하겠지만, 누군가 그것을 돌보는 것을 염려한다면, 나는 숫자에 관심이있을 것이다. –
qstring.cpp에서 toLatin1_helper를 살펴보면 전체 문자열 변환은 문자열의 모든 문자를 반복하고 QByteArray를 할당해야합니다. 다른 한편으로, 평등성 검사는 memcmp이며 SSE2에 대한 최적화 된 경로가 있습니다 (이것은 4.7.2에서 유용하게 사용됩니다). 내 버전은 QString :: data()를 사용하여 QChar를 얻을 수있다. 나는 대부분 임시 할당을 피하는 목표를 달성하려고 애썼지 만,이 경우 더 빠를 수 있을지 전혀 모른다. –
QString은 unicode를 포함하고 std :: string은 무엇이든 될 수 있으므로 std :: string의 내용에 대한 가정없이 "평등"을 정의하는 직접적인 방법은 없습니다. –