2013-08-14 32 views
5

Tôi muốn so sánh hiệu quả QString và std :: string for (in) equality. Cách nào tốt nhất để làm điều đó, có thể không tạo đối tượng trung gian?so sánh hiệu quả QString và std :: chuỗi cho sự bình đẳng

+4

QString giữ unicode, std :: string có thể là bất cứ điều gì, vì vậy không có cách nào thẳng xác định "bình đẳng" ở đây mà không có giả định về nội dung của chuỗi std ::. –

Trả lời

0

QString::fromStdString()QString::toStdString() lưu ý, nhưng chúng tạo bản sao tạm thời của chuỗi, do đó, nếu bạn không muốn có đối tượng tạm thời, bạn sẽ phải tự viết chức năng này (mặc dù hiệu quả hơn là câu hỏi).

Ví dụ:

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 

Bằng cách trong qt5, QString::toStdString() bây giờ sử dụng QString::toUtf8() để thực hiện việc chuyển đổi, vì vậy các thuộc tính Unicode của chuỗi sẽ không bị mất (qt-project.org/doc/qt- 5.0/qtcore/qstring.html # toStdString

+0

Tùy chọn đầu tiên, (string.toStdString() == stdstring), gây ra bộ nhớ bị rò rỉ trên Windows trên ARM (không phải vấn đề về máy tính để bàn hoặc Linux). Tùy chọn thứ hai, (str == QString :: fromStdString (stdstring)), hoạt động tốt. – pixelgrease

0

Nó có thể được thực hiện mà không đối tượng trung gian, nếu bạn là hoàn toàn chắc chắn rằng hai chuỗi chứa các ký tự chỉ Latinh:

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; 
} 

Nếu không, bạn nên giải mã số std::string thành một số QString và so sánh hai số QStrings.

+1

Vì vậy, thay vì chuyển đổi toàn bộ chuỗi cùng một lúc, bạn thực hiện chuyển đổi qua toLatin1() char bằng char. Tôi cho rằng điều đó kém hiệu quả hơn, nhưng nếu có ai quan tâm đến nó, tôi sẽ quan tâm đến những con số. –

+0

Nhìn vào toLatin1_helper trong qstring.cpp, chuyển đổi chuỗi đầy đủ phải lặp lại trên mỗi char trong chuỗi anyway, cộng với phân bổ một QByteArray. Mặt khác, kiểm tra bình đẳng sau đó là một memcmp, và có một đường dẫn tối ưu hóa cho SSE2 mà sẽ tạo sự khác biệt (đây là trong 4.7.2 đó là những gì tôi có tiện dụng vì vậy có thể đã thay đổi). Phiên bản của tôi có thể được tối ưu hóa bằng cách sử dụng QString :: data() để nhận được QChar *. Tôi hầu như cố gắng đáp ứng mục tiêu tránh phân bổ tạm thời, nhưng tôi không biết liệu điều đó có nhanh hơn trong trường hợp này hay không. –

Các vấn đề liên quan