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
Trả lời
QString::fromStdString()
và 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
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
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
.
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ố. –
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. –
- 1. chuỗi So sánh bình đẳng trong ksh
- 2. Integer chuỗi so sánh đều bình đẳng (PHP lỗi?)
- 3. phao so sánh (bình đẳng) trong CoreGraphics
- 4. So sánh bình đẳng tùy chỉnh cho WPF ComboBox
- 5. Sự bình đẳng cho .NET PropertyInfos
- 6. Kiểm tra chuỗi bình đẳng/so sánh chuỗi trong vỏ Cá?
- 7. Làm thế nào để so sánh các giá trị hàm Scala cho sự bình đẳng
- 8. Mảng của Ruby. so sánh các yếu tố cho sự bình đẳng?
- 9. So sánh XmlDocument cho sự bình đẳng (nội dung thông minh)
- 10. Làm thế nào để so sánh 2 đối tượng cho sự bình đẳng trong Objective-C
- 11. Octave/MATLAB: Làm thế nào để so sánh các cấu trúc cho sự bình đẳng?
- 12. So sánh hai mảng numpy cho sự bình đẳng, yếu tố thông minh
- 13. So sánh pandas.Series cho sự bình đẳng khi chúng chứa nan?
- 14. so sánh hai hình ảnh và kiểm tra sự bình đẳng
- 15. Giá đắt như thế nào so sánh hai bộ không theo thứ tự cho sự bình đẳng?
- 16. Đánh dấu khi toán tử bình đẳng (==) được sử dụng để so sánh chuỗi trong Eclipse
- 17. Chuỗi bình đẳng với xử lý vô
- 18. Sự bình đẳng giữa 2 HashMap
- 19. So sánh hai Danh sách <string> cho bình đẳng
- 20. ưu điểm của QString so với std :: string
- 21. so sánh bất bình đẳng toàn cầu cho cặp <> trong C++ chuẩn
- 22. kiểm tra cho sự bất bình đẳng trong T-SQL
- 23. Thử nghiệm chuỗi bình đẳng bằng cách sử dụng hashCode()
- 24. Trình so sánh bình đẳng mặc định cho một loại thiết lập là gì?
- 25. Binary cây tìm kiếm traversal so sánh hai con trỏ cho bình đẳng
- 26. Cách hiệu quả nhất để kiểm tra sự bình đẳng của lambda biểu thức
- 27. Cách hiệu quả nhất để lưu điểm và so sánh?
- 28. Đối sánh mẫu Bất bình đẳng
- 29. Đánh giá sự bình đẳng về tài sản ở Nant
- 30. jUnit và ổi, so sánh danh sách bình đẳng sau khi biến đổi()
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 ::. –