के लिए लोकेल-निर्भर ऑर्डरिंग मैं लोकेल-निर्भर तरीके से std::string
एस की तुलना करने की कोशिश कर रहा हूं।std :: string
साधारण सी शैली तार के लिए, मैं strcoll
पाया है, जो करता है मैं वास्तव में क्या चाहते हैं, कर 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;
}
हालांकि बाद, मैं भी std::string
के लिए इस व्यवहार करना चाहते हैं। मैं सिर्फ operator<
ओवरलोड सकता है की तरह
bool operator<(const std::string& a, const std::string& b)
{
return strcoll(a.c_str(), b.c_str());
}
कुछ करने के लिए लेकिन फिर मैं std::less
और std::string::compare
का उपयोग कर कोड के बारे में चिंता करने की ज़रूरत होगी, तो यह सही नहीं लगता है।
क्या इस तरह के संयोजन को तारों के लिए एक सहज तरीके से काम करने का कोई तरीका है?
यह आसान है। यह मानक संग्रह बिना प्रयास किए काम करता है। लोकेल पर – CAdaker