📜  算法库| C ++魔术师STL算法(1)

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

算法库 | C++魔术师STL算法

C++标准库中的STL算法是一个非常强大、灵活、高效并且广泛应用的算法库。它包含了大量常用的算法,从简单的基本算法,到复杂的高级算法,几乎可以应对各种数据结构和算法问题。在本文中,我们将会介绍STL算法的基本使用、常见函数及其应用,希望对程序员们的学习和理解有所帮助。

基本使用

STL算法库的头文件为<algorithm>,所有的算法函数都在这个头文件中。STL算法库的大部分函数都采用迭代器来操作元素,所以它可以应用于STL容器,如vector、list、dequeue、set、map等,以及普通数组等。

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v{5, 2, 9, 7, 1, 8, 4, 6, 3};

    // 使用STL算法库排序
    sort(v.begin(), v.end());

    // 输出排序后的结果
    for(auto& i : v) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

1 2 3 4 5 6 7 8 9
常见函数及其应用
排序

STL算法库中有许多排序函数,如sort()partial_sort()nth_element()stable_sort()等。这里我们主要介绍sort()函数。

template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);

sort()函数会将[first, last)范围内的元素升序排序。它的时间复杂度为$O(nlogn)$。

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v{5, 2, 9, 7, 1, 8, 4, 6, 3};

    // 使用STL算法库排序
    sort(v.begin(), v.end());

    // 输出排序后的结果
    for(auto& i : v) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

1 2 3 4 5 6 7 8 9
二分查找

STL算法库中有许多查找函数,如binary_search()lower_bound()upper_bound()等。这里我们主要介绍binary_search()函数。

template <class ForwardIterator, class T>
bool binary_search(ForwardIterator first, ForwardIterator last, const T& value);

binary_search()函数返回一个bool类型的值,表示是否找到了value。如果找到了value,返回true;否则返回false。

#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v{1, 2, 3, 4, 5, 6, 7, 8, 9};

    if (binary_search(v.begin(), v.end(), 7)) {
        cout << "Found" << endl;
    } else {
        cout << "Not found" << endl;
    }

    return 0;
}

输出结果:

Found
复制

STL算法库中有许多复制函数,如copy()copy_n()copy_if()等。这里我们主要介绍copy()函数。

template <class InputIterator, class OutputIterator>
OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result);

copy()函数将[first, last)范围内的元素复制到[result, result + (last - first))中。它返回一个指向复制结束的迭代器,通常用来检查复制是否成功。

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;

int main() {
    vector<int> v{1, 2, 3, 4, 5};
    vector<int> res(5);

    // 复制v中的元素到res中
    copy(v.begin(), v.end(), res.begin());

    // 输出复制后的结果
    for(auto& i : res) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

1 2 3 4 5
唯一化

STL算法库中有许多唯一化函数,如unique()unique_copy()等。这里我们主要介绍unique()函数。

template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last);

unique()函数将[first, last)范围内的元素去重,返回去重后的最后一个元素的迭代器。注意,它不会改变[first, last)范围内的元素个数。

#include <algorithm>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;

int main() {
    vector<int> v{1, 2, 2, 3, 3, 3, 4, 4, 4, 4};

    // 唯一化v中的元素
    auto last = unique(v.begin(), v.end());
    v.erase(last, v.end());

    // 输出唯一化后的结果
    for(auto& i : v) {
        cout << i << " ";
    }
    cout << endl;

    return 0;
}

输出结果:

1 2 3 4
总结

STL算法库的使用非常广泛,它可以使代码更加简洁、高效、易于维护。在实战中,我们可以将STL算法库与STL容器、函数对象、Lambda表达式等相结合,以提高代码的质量、效率和可读性。因此,我们应该认真学习STL算法库,并尽可能地将其运用到实际项目中。