📜  C++ STL-algorithm.sort()函数(1)

📅  最后修改于: 2023-12-03 15:13:55.392000             🧑  作者: Mango

C++ STL-algorithm.sort()函数

C++ STL (Standard Template Library)是C++标准库的一部分,提供了丰富的数据结构和算法。其中,algorithm头文件中提供了算法相关的函数,其中包括 sort() 函数,用于给容器中的元素排序。

函数原型
template <typename T> 
void sort(T begin, T end);
  • begin:需要排序的容器中的首个元素的迭代器。
  • end:需要排序的容器中的最后一个元素之后的迭代器。

sort()函数可以用于排序包括数组、vector、deque、list、forward_list和string等。支持对数值类型(如int、double)和自定义类型的排序。

排序类型

sort()函数支持排序类型包括:

  • 默认排序 (operator <)
  • 自定义排序 (lambda function,functor 或者 function pointer)
默认排序

默认排序使用元素的 operator < 实现,比如对于 vector<int>,会按照从小到大的方式进行排序。

#include<algorithm>
#include<vector>
#include<iostream>

using namespace std;

int main() {
    vector<int> vec = { 3, 2, 5, 1, 4 };
    sort(vec.begin(), vec.end());
    for(const auto& e : vec) {
        cout << e << " ";
    }
}

输出结果:

1 2 3 4 5
自定义排序

自定义排序需要提供一个二元谓词,定义排序顺序。

lambda function 进行排序

lambda function 方便对需要排序的容器中元素的多种属性进行排序

#include<algorithm>
#include<vector>
#include<iostream>

using namespace std;

int main() {
    struct Book {
        string author;
        string title;
        unsigned year;
    };

    vector<Book> books = {
        {"Jack Kerouac", "On the Road", 1957},
        {"J.D. Salinger", "Catcher in the Rye", 1951},
        {"F. Scott Fitzgerald", "The Great Gatsby", 1922},
        {"Vladimir Nabokov", "Lolita", 1955}
    };

    sort(begin(books), end(books), [](const Book& a, const Book& b) {
        return a.year < b.year;
    });

    for (const auto& book : books) {
        cout << book.title << " (" << book.author << ", " << book.year << ")" << endl;
    }
}

输出结果:

The Great Gatsby (F. Scott Fitzgerald, 1922)
Catcher in the Rye (J.D. Salinger, 1951)
On the Road (Jack Kerouac, 1957)
Lolita (Vladimir Nabokov, 1955)

functor进行排序

functor常用于定义重载运算符的类,是一种函数对象类型,可以通过在类中定义重载运算符(例如<运算符),创造出可调用的对象,并且具有状态。通过重载<运算符,可以自定义排序顺序。

#include<algorithm>
#include<vector>
#include<iostream>

using namespace std;

class Dog {
public:
    Dog(int age, string name) : m_age(age), m_name(name) {}

    friend bool operator<(const Dog& lhs, const Dog& rhs) {
        return lhs.m_age < rhs.m_age;
    }

    friend ostream& operator<<(ostream& out, const Dog& dog) {
        out << dog.m_name;
        return out;
    }

private:
    int m_age;
    string m_name;
};

int main() {
    vector<Dog> dogs = { {"Fido", 3}, {"Spike", 1}, {"Wiley", 5} };
    sort(begin(dogs), end(dogs));
    for(const auto& dog : dogs) {
        cout << dog << " ";
    }
}

输出结果:

Spike Fido Wiley

function pointer进行排序

使用函数指针排序,需要定义一个二元谓词函数。通过函数指针传递给 sort() 函数进行自定义排序。

#include<algorithm>
#include<vector>
#include<iostream>

using namespace std;

bool sortByTitle(const Book& a, const Book& b) {
    return a.title < b.title;
}

int main() {
    struct Book {
        string author;
        string title;
        unsigned year;
    };

    vector<Book> books = {
        {"Jack Kerouac", "On the Road", 1957},
        {"J.D. Salinger", "Catcher in the Rye", 1951},
        {"F. Scott Fitzgerald", "The Great Gatsby", 1922},
        {"Vladimir Nabokov", "Lolita", 1955}
    };
    sort(begin(books), end(books), sortByTitle);
    for (const auto& book : books) {
        cout << book.title << " (" << book.author << ", " << book.year << ")" << endl;
    }
}

输出结果:

Catcher in the Rye (J.D. Salinger, 1951)
Lolita (Vladimir Nabokov, 1955)
On the Road (Jack Kerouac, 1957)
The Great Gatsby (F. Scott Fitzgerald, 1922)
时间复杂度

sort() 函数使用的是快速排序(Quick Sort)的变体,具有以下时间复杂度:

  • 最坏时间复杂度:$O(n^2)$
  • 最好时间复杂度:$O(n log n)$
  • 平均时间复杂度:$O(n log n)$
总结

sort() 函数是C++ STL中功能强大的算法之一,可以用于对容器任意类型的元素进行排序。默认排序使用默认的 “less than” 运算符 <,自定义排序可以通过 lambda function、functor、或者 function pointer 定义二元谓词进行自定义排序。