所有程序中,排序都是非常常用的操作,在C++中,标准库algorithm
中有一个函数叫做std::sort()
,它就是用来排序的函数。由于排序非常常用,所以拿出来进行简单的使用说明。
基础示例 1
#include <algorithm> // std::sort()
#include <string> // std::string
#include <iostream> // std::cin std::cout std::endl
int main(void)
{
std::string text;
std::cin >> text;
std::cout << "排序前:" << text << std::endl;
std::sort(text.begin(), text.end());
std::cout << "排序后:" << text << std::endl;
return 0;
}
输入数据:
banana
输出数据:
排序前:banana
排序后:aaabnn
基础讲解 1
代码中,text.begin()
和text.end()
返回的是字符串的迭代器(以后教程讲解),也就是字符串的第一个位置和最后一个位置。函数std::sort()
只需要这两个参数,就可以对字符串进行排序。那么对banana
排序,就是按字母顺序从小到大排序,所以结果就是aaabnn
。
std::sort()
函数默认是从小到大排序的,那么如果想要从大到小排序,可以看一下例子:
基础示例 2
#include <algorithm> // std::sort()
#include <string> // std::string
#include <iostream> // std::cin std::cout std::endl
// 供排序函数从小到大排序
bool less(char a, char b)
{
return a < b;
}
// 供排序函数从大到小排序
bool greater(char a, char b)
{
return a > b;
}
int main(void)
{
std::string text;
std::cin >> text;
std::sort(text.begin(), text.end(), less);
std::cout << "从小到大排序:" << text << std::endl;
std::sort(text.begin(), text.end(), greater);
std::cout << "从大到小排序:" << text << std::endl;
return 0;
}
输入数据:
banana
输出数据:
从小到大排序:aaabnn
从大到小排序:nnbaaa
基础讲解 2
从代码可以看出,只需要指定std::sort()
函数的第三个参数就可以控制它的排序方式。std::sort()
的第三个接受一个函数,这个函数必须是两个参数,而且和字符串中字符的类型要相同。当第一个参数小于第二个参数时,排序结果是从小到大;当第一个参数大于第二个参数时,排序结果是从大到小。
从大到小的排序:
基础拓展 2
事实上,标准库中有大于号和小于号的比较函数std::greater
和std::less
,它们都在functional
标准库中。
注意:虽然std::greater
和std::less
是函数的名义,但是它们实际上是类。
#include <algorithm> // std::sort()
#include <string> // std::string
#include <iostream> // std::cin std::cout std::endl
#include <functional> // std::greater std::less
int main(void)
{
std::string text;
std::cin >> text;
std::sort(text.begin(), text.end(), std::less<char>());
std::cout << "从小到大排序:" << text << std::endl;
std::sort(text.begin(), text.end(), std::greater<char>());
std::cout << "从大到小排序:" << text << std::endl;
return 0;
}
std::less
和std::greater
都需要在<>
中指明进行比较的数据类型,由于上面代码中std::string
的单个字符的数据类型是char
,所以就是std::less<char>
类和std::greater<char>
类。然后std::less<char>()
和std::greater<char>()
创建出一个临时对象作为参数值传给std::sort()
函数。
提示:对于std::less<char>()
的理解,实际上和int()
的理解是一样的,都是创建默认值。