自学内容网 自学内容网

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六大组件
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;
}

运行结果如下

四. 下篇内容:C++ STL string 的使用 


原文地址:https://blog.csdn.net/yzcllzx/article/details/143978358

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!