2013-08-14 91 views
5

효율적으로 QString과 std :: string을 (를) 동등하게 비교하려고합니다. 중간 개체를 만들지 않고 가장 좋은 방법은 무엇입니까?QString과 std :: string의 동등성을 효율적으로 비교하십시오.

+4

QString은 unicode를 포함하고 std :: string은 무엇이든 될 수 있으므로 std :: string의 내용에 대한 가정없이 "평등"을 정의하는 직접적인 방법은 없습니다. –

답변

0

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

+0

첫 번째 옵션 인 (string.toStdString() == stdstring)으로 인해 Windows에서 ARM의 누수 메모리가 발생했습니다 (데스크톱 또는 Linux 문제가 아님). 두 번째 옵션 (str == QString :: fromStdString (stdstring))은 정상적으로 작동합니다. – pixelgrease

0
당신이 두 개의 문자열은 라틴 문자가 포함 절대적으로 확신하는 경우 그것은, 중간 오브젝트없이 할 수

:

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::stringQString으로 디코딩하여 두 QStrings을 비교해야합니다.

+1

그래서 전체 문자열을 한 번에 변환하는 대신 char을 사용하여 toLatin1() char을 통해 변환을 수행합니다. 나는 그것이 덜 효율적이라고 생각 하겠지만, 누군가 그것을 돌보는 것을 염려한다면, 나는 숫자에 관심이있을 것이다. –

+0

qstring.cpp에서 toLatin1_helper를 살펴보면 전체 문자열 변환은 문자열의 모든 문자를 반복하고 QByteArray를 할당해야합니다. 다른 한편으로, 평등성 검사는 memcmp이며 SSE2에 대한 최적화 된 경로가 있습니다 (이것은 4.7.2에서 유용하게 사용됩니다). 내 버전은 QString :: data()를 사용하여 QChar를 얻을 수있다. 나는 대부분 임시 할당을 피하는 목표를 달성하려고 애썼지 만,이 경우 더 빠를 수 있을지 전혀 모른다. –