14.C++STL1(STL简介)
⭐本篇重点:STL简介
⭐本篇代码:c++学习/7.STL简介/07.STL简介 · 橘子真甜/c++-learning-of-yzc - 码云 - 开源中国 (gitee.com)
一. STL六大组件简介
C++的STL(standard templace library)是C++标准库的一部分,称为标准模板库。STL六大组件如下
STL六大组件 | 含义 |
容器 | 容器是一些封装好的模板类,如 vector, string, list ,deque, map, set, unordered_set, unordered_map, multimap, multiset |
迭代器 | 迭代器用于容器中数据的读写操作,是容器和算法之间的粘合剂。迭代器有四种,分别为 iterator(普通迭代器),const_iterator(const迭代器),reverse_iterator(反向迭代器),const_reverse_iterator(反向const迭代器) |
算法 | STL中包含了很多实用的数据结构算法,这些函数都被设置为模板函数,方便用户使用。这些算法都大多位于头文件 <algorithm>中,部分位于<numeric>中。常用的算法有 sort,find,swap,reverse,merge等 |
仿函数 | 我们在类中将()这个运算符进行重载,这个类就是函数对象类。这个类的对象就叫仿函数。常用的仿函数有 greater,less |
适配器 | 将已有的类(一个或者多个)的接口通过改造适配成我们想要的形式,从而形成新的类并向外提供接口。如 statck(栈),queue(队列),priority_queue(优先级队列) |
空间配置器 | 为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。如 allocator |
二. STL常见算法的简易使用
2.1 swap
swap用于交换两个相同类型的变量,swap可以交换自定义类型变量(交换成员变量)
#include <iostream>
#include <algorithm>
using namespace std;
class A
{
public:
A(int a = 0)
:_a(a)
{};
void print()
{
cout << _a << endl;
}
private:
int _a;
};
int main()
{
int a = 1;
int b = 2;
char c1 = 'a';
char c2 = 'b';
A d1(10);
A d2(20);
cout << "交换前" << endl;
cout << "a:" << a << " b:" << b << endl;
cout << "c1:" << c1 << " c2:" << c2 << endl;
d1.print();
d2.print();
swap(a, b);
swap(c1, c2);
swap(d1, d2); //交互自定义类型
cout << endl << "交换后" << endl;
cout << "a:" << a << " b:" << b << endl;
cout << "c1:" << c1 << " c2:" << c2 << endl;
d1.print();
d2.print();
return 0;
}
运行结果如下
2.2 sort
sort可以用于对数组进行排序(内部实现算法主要为快速排序),sort默认的排序方式是排升序,如果想要排降序需要使用仿函数,自定义排序函数,lambda表达式
对于数组的排序,排升序使用方法如下
sort(数组名,数组名+数组长度);
举例代码:
#include <iostream>
#include <algorithm>
using namespace std;
void print(int* arr, int len)
{
for (int i = 0; i < len; i++)
cout << arr[i] << " ";
cout << endl;
}
int main()
{
int arr[20] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++)
{
arr[i] = rand() % 100;
}
cout << "排序前" << endl;
print(arr, len);
sort(arr, arr + len);
cout << "排序后" << endl;
print(arr, len);
return 0;
}
运行结果如下:
注意:sort使用的是快速排序,快速排序不能保证稳定性
如果我们想要保证稳定性,需要使用 stable_sort(主要使用归并排序)
如果我们想要节省空间,可以使用 partial_sort(主要使用堆排序)
追求最快的速度,选择sort
2.3 binary_search lower_bound up_bound
binary_search:二分查找一个已经排序的数组,返回值是bool
lower_bound:二分查找一个数组中最左边的某个数,成功返回该数的下标,失败返回最后下标的下一位
up_bound:二分查找一个数组中最右边的某个数,成功返回该数的下标,失败返回最后下标的下一位
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,8,8,8,9,10,11,12 };
int flag = binary_search(arr, arr + sizeof(arr) / sizeof(int), 8);
int* p1 = lower_bound(arr, arr + sizeof(arr) / sizeof(int), 8);
int* p2 = upper_bound(arr, arr + sizeof(arr) / sizeof(int), 8);
int* p3 = lower_bound(arr, arr + sizeof(arr) / sizeof(int), 123);
if (flag)
cout << "找到了!" << endl;
cout << "p1下标" << p1 - arr << endl;
cout << "p2下标" << p2 - arr << endl;
cout << "p3下标" << p3 - arr << endl;
return 0;
}
三. 仿函数的简单使用
使用仿函数完成 sort的降序排序
#include <iostream>
#include <algorithm>
using namespace std;
//仿函数
struct compare
{
//重载(),返回值设置为bool
bool operator()(const int& a, const int& b)
{
//a比b大,返回true。让b排前面
if (a >= b)
return true;
else
return false;
}
};
void print(int* arr, int len)
{
for (int i = 0; i < len; i++)
cout << arr[i] << " ";
cout << endl;
}
int main()
{
int arr[10] = { 0 };
int len = sizeof(arr) / sizeof(int);
for (int i = 0; i < len; i++)
{
arr[i] = rand() % 100;
}
cout << "排序前" << endl;
print(arr, len);
cout << "sort默认排升序" << endl;
sort(arr, arr + len);
print(arr, len);
cout << "使用仿函数排降序序" << endl;
sort(arr, arr + len, compare());
print(arr, len);
return 0;
}
运行结果如下