14.C++STL1(STL简介)

devtools/2024/11/23 21:58:03/

⭐本篇重点: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.ppmy.cn/devtools/136390.html

相关文章

C++:设计模式-单例模式

单例模式&#xff08;Singleton Pattern&#xff09;是一种设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并且提供全局访问点。实现单例模式的关键是防止类被多次实例化&#xff0c;且能够保证实例的唯一性。常见的实现手法包括懒汉式、饿汉式、线程安全的懒汉式等。…

DrissionPage爬虫工具教程

当然可以&#xff01;下面是一些更高级和复杂的 DrissionPage 使用示例&#xff0c;包括处理动态加载的内容、处理登录和会话、处理多页面操作等。 处理动态加载的内容 许多现代网站使用 JavaScript 动态加载内容。在这种情况下&#xff0c;我们需要等待特定的元素出现&#…

大三学生实习面试经历(1)

最近听了一位学长的建议&#xff0c;不能等一切都准备好再去开始&#xff0c;于是就开始了简历投递&#xff0c;恰好简历过了某小厂的初筛&#xff0c;开启了线上面试&#xff0c;记录了一些问题&#xff1a; &#xff08;通过面试也确实了解到了自己在某些方面确实做的还不够…

40分钟学 Go 语言高并发:Goroutine基础与原理

Day 03 - goroutine基础与原理 1. goroutine创建和调度 1.1 goroutine基本特性 特性说明轻量级初始栈大小仅2KB&#xff0c;可动态增长调度方式协作式调度&#xff0c;由Go运行时管理创建成本创建成本很低&#xff0c;可同时运行数十万个通信方式通过channel进行通信&#x…

小鹏汽车智慧材料数据库系统项目总成数据同步

1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构&#xff1a; 这几个表总数为100多万&#xff0c;经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图&#xff1a; 界面&#xff1a; SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…

vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数

vue3 uniapp 扫普通链接或二维码打开小程序并获取携带参数 微信公众平台添加配置 微信公众平台 > 开发管理 > 开发设置 > 扫普通链接二维码打开小程序 配置链接规则需要下载校验文档给后端存入服务器中&#xff0c;保存配置的时候会校验一次&#xff0c;确定当前的配…

Cmakelist.txt之win-c-udp-client

1.cmakelist.txt cmake_minimum_required(VERSION 3.16) ​ project(c_udp_client LANGUAGES C) ​ add_executable(c_udp_client main.c) ​ target_link_libraries(c_udp_client wsock32) ​ ​ include(GNUInstallDirs) install(TARGETS c_udp_clientLIBRARY DESTINATION $…

(神领物流)day01项目概述

项目概述要在面试的时候准确的说出整体的项目内容简单介绍&#xff01;&#xff01;&#xff01;&#xff01;至关重要 形成大型的物流公司&#xff0c;车辆的调度等等都交给系统&#xff0c;让我们的操作更加智能化&#xff0c;提升工作效率&#xff1b; &#xff01;&#xf…