• Index

排序

Reads: 7

所有程序中,排序都是非常常用的操作,在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::greaterstd::less,它们都在functional标准库中。

注意:虽然std::greaterstd::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::lessstd::greater都需要在<>中指明进行比较的数据类型,由于上面代码中std::string的单个字符的数据类型是char,所以就是std::less<char>类和std::greater<char>类。然后std::less<char>()std::greater<char>()创建出一个临时对象作为参数值传给std::sort()函数。

提示:对于std::less<char>()的理解,实际上和int()的理解是一样的,都是创建默认值。


Comments

Make a comment

  • Index

WARNING: You are using an old browser that does not support HTML5. Please choose a modern browser (Chrome / Microsoft Edge / Firefox / Sarafi) to get a good experience.