当前位置: 首页 > news >正文

14.C++STL1(STL简介)

⭐本篇重点:STL简介

⭐本篇代码:c++学习/7.STL简介/07.STL简介 · 橘子真甜/c++-learning-of-yzc - 码云 - 开源中国 (gitee.com)

目录

一. STL六大组件简介

二. STL常见算法的简易使用

2.1 swap

​2.2 sort 

2.3 binary_search lower_bound up_bound  

三. 仿函数的简单使用 

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


一. 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
{//重载(),返回值设置为boolbool operator()(const int& a, const int& b){//a比b大,返回true。让b排前面if (a >= b)return true;elsereturn 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 的使用 


http://www.mrgr.cn/news/77805.html

相关文章:

  • C++学习——编译的过程
  • 02.06、回文链表
  • 1.tree of thought (使用LangChain解决4x4数独问题)
  • Java IO 基础知识总结下
  • 使用 Excel 的功能来快速在 TXT 文件中添加一列零
  • 开源项目低代码表单设计器FcDesigner获取表单的层级结构与组件数据
  • 【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)
  • minikube单机k8s出现Listen: listen tcp :53: bind: permission denied
  • 【题解】—— LeetCode一周小结46
  • CSRF保护--laravel进阶篇
  • 【大数据学习 | Spark-Core】spark-shell开发
  • 《线性代数的本质》
  • 【计算机网络】网段划分
  • C#语言入门
  • 《Shader 入门精要》学习笔记 茵蒂克丝
  • 用python将一个扫描pdf文件改成二值图片组成的pdf文件
  • [模版总结] - 树的基本算法4 -最近公共祖先 LCA
  • 【大数据学习 | Spark-Core】yarn-client与yarn-cluster的区别
  • 浦语提示词工程实践(LangGPT版,服务器上部署internlm2-chat-1_8b,踩坑很多才完成的详细教程,)
  • 复习!!!
  • Spring |(二)IoC相关内容 | bean
  • Long noncoding RNAs and humandisease
  • 微服务即时通讯系统的实现(服务端)----(1)
  • 计算机视觉 1-8章 (硕士)
  • 动态内存管理
  • leetcode:112. 路径总和