📅  最后修改于: 2023-12-03 15:11:33.104000             🧑  作者: Mango
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算法库,并尽可能地将其运用到实际项目中。