这是我当前的代码:
#include <list>
#include <string>
using std::string;
using std::list;
int main()
{
list <string> list_;
list_.push_back("C");
list_.push_back("a");
list_.push_back("b");
list_.sort();
}
sort()
函数是否根据字符代码对元素进行排序?我希望排序完成后这里的结果是 a b C
。
最佳答案
如果您想支持其他语言的字符,则不区分大小写的字符比较会很棘手。这就是为什么以对语言环境敏感的方式执行它们是个好主意:
struct char_iless
: public std::binary_function<char, char, bool>
{
std::locale loc;
char_iless(std::locale const & loc=std::locale()) : loc(loc)
{
}
bool operator()(char a, char b) const
{
return std::tolower(a, loc) < std::tolower(b, loc);
}
};
这就是你如何使用这个类来比较两个字符:
char_iless('a', 'b', my_locale);
如果您想使用设置为默认的区域,只需使用 std::locale()
作为 my_locale
。
如果您可以使用 Boost,那么字符串算法库中就有一个 is_iless
仿函数,它可以做同样的事情。
由于 std::lexicographical_compare
,将此从比较字符扩展到字符串很容易:
struct str_iless
: public std::binary_function<std::string, std::string, bool>
{
std::locale loc;
str_iless(std::locale const & loc=std::locale()) : loc(loc)
{
}
bool operator()(std::string const & a, std::string const & b) const
{
return std::lexicographical_compare(
a.begin(), a.end(),
b.begin(), b.end(),
char_iless(loc)
);
}
};
现在您已具备解决问题所需的一切:
int main()
{
std::list<std::string> list;
list.push_back("C");
list.push_back("a");
list.push_back("b");
// Sort using default locale
list.sort(str_iless());
// Sort using French locale
// (warning: this locale format string is MS specific)
std::locale loc("French_France.1252");
list.sort(str_iless(loc));
}
关于c++ - 如何使用区分大小写的元素对 std::list 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2346714/