我遇到的问题是,我需要对一大堆字符指针进行排序,但是它们有特殊的字符。我设法得到了这样的排序程序:
std::sort(dict_.begin(), dict_.end(), comp);
bool comp(NumPair& a, NumPair& b)
{
return boost::lexicographic_compare(a.pFirst, b.pFirst);
}这很有效,除了所有特殊的德语字符都排在其他字符之前。我的老师(是的,这是关于家庭作业的),然而,希望他们在最后排序。太棒了!
所以我在玩,我想我可以用我在网站上看到的一个技巧,让一个地区的地方包括这样的特殊人物。
return boost::lexicographic_compare(a.pFirst, b.pFirst, locale("german"));没起作用!所以:
bool comp()
{
setlocale(LC_ALL, "");
return boost::lexicographic_compare(a.pFirst, b.pFirst);
}没起作用!
如果你有,我很想听听其他一些可能有效的想法。
更新:
根据要求,一些样本输入和输出:
// Some entries
dict_.push_back( NumPair ( "öffnen", "to open" ) );
dict_.push_back( NumPair ( "überraschen", "to surprise" ) );
dict_.push_back( NumPair ( "wünschen", "to wish, to desire, to want" ) );
dict_.push_back( NumPair ( "widersprechen", "to contradict_" ) );
// NumPair ctor.
NumPair( const char *pFirst, const char *pSecond )
{
/* Deep copy of pFirst and pSecond */
}结果后的产出:
öffnen
überraschen
wünschen
widersprechen发布于 2010-10-31 20:55:08
您可能想要显示更多的代码,比如您使用的字符串会导致这个问题。我很容易就能对一组德语单词进行排序,任何以非ASCII特殊德语字符开头的单词都会在末尾排序。即使没有任何特殊的德语区域设置,也会发生这种情况,因为在Unicode中,非ASCII字符的代码点值高于ASCII字符。
例如:
setlocale(LC_ALL, "");
std::vector<std::wstring> vec;
vec.push_back(L"Hallo");
vec.push_back(L"Morgen");
vec.push_back(L"Zebra");
vec.push_back(L"Abend");
vec.push_back(L"Übertragens");
vec.push_back(L"Buchen");
std::sort(vec.begin(), vec.end());
for (std::vector<std::wstring>::iterator it = vec.begin(); it != vec.end(); ++it)
std::wcout << *it << std::endl;这一产出如下:
Abend
Buchen
Hallo
Morgen
Zebra
Übertragens注意宽字符串的使用。由于词汇表比较例程逐字符比较,所以您需要使用宽字符,否则比较函数将最终逐字节比较字符串,而不是逐字符进行比较。这将导致无效的比较,因为并不是每个Unicode字符都可以存储在一个字节中。例如,特殊的德文字符是UTF-8中的2个字节,因此您需要一个数据类型,能够在单个元素中包含0x00到0xFFFF的范围。在大多数平台上,wchar_t就足够了。
(还请注意,在源代码中包含非ASCII字符并不是一个好做法。使用“通用字符代码”代替。我只是在这里使用非ASCII源代码来澄清。)
发布于 2010-10-31 21:50:31
如果您使用windows,我建议您使用CompareString函数。http://msdn.microsoft.com/en-us/library/dd317759
地区很容易出错。此外,如果使用区域设置,则线程会引发问题。
https://stackoverflow.com/questions/4064984
复制相似问题