Tôi đang cố gắng so sánh std::string
s theo cách phụ thuộc vào miền địa phương.đặt hàng phụ thuộc vào miền địa phương cho std :: string
Đối với chuỗi C-phong cách bình thường, tôi đã tìm thấy strcoll
, mà thực hiện chính xác những gì tôi muốn, sau khi làm std::setlocale
#include <iostream>
#include <locale>
#include <cstring>
bool cmp(const char* a, const char* b)
{
return strcoll(a, b) < 0;
}
int main()
{
const char* s1 = "z", *s2 = "å", *s3 = "ä", *s4 = "ö";
std::cout << (cmp(s1,s2) && cmp(s2,s3) && cmp(s3,s4)) << "\n"; //Outputs 0
std::setlocale(LC_ALL, "sv_SE.UTF-8");
std::cout << (cmp(s1,s2) && cmp(s2,s3) && cmp(s3,s4)) << "\n"; //Outputs 1, like it should
return 0;
}
Tuy nhiên, tôi muốn có hành vi này cho std::string
là tốt. Tôi chỉ có thể quá tải operator<
để làm một cái gì đó giống như
bool operator<(const std::string& a, const std::string& b)
{
return strcoll(a.c_str(), b.c_str());
}
nhưng sau đó tôi sẽ phải lo lắng về mã sử dụng std::less
và std::string::compare
, vì vậy nó không cảm thấy đúng.
Có cách nào để làm cho loại đối chiếu này hoạt động cho các chuỗi theo cách liền mạch không?
Tiện dụng. Nó làm cho các bộ sưu tập tiêu chuẩn làm việc mà không cần nỗ lực. – CAdaker