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
{
	//重载(),返回值设置为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 的使用 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/921555.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5G CPE与4G CPE的主要区别有哪些

什么是CPE&#xff1f; CPE是Customer Premise Equipment&#xff08;客户前置设备&#xff09;的缩写&#xff0c;也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备&#xff0c;用于连接用户…

智能安全配电装置在高校实验室中的应用

​ 摘要&#xff1a;高校实验室是科研人员进行科学研究和实验的场所&#xff0c;通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例&#xff0c;对事故原因、危害程度以及防范措施进行分析和总结…

深入理解 LMS 算法:自适应滤波与回声消除

深入理解 LMS 算法&#xff1a;自适应滤波与回声消除 在信号处理领域&#xff0c;自适应滤波是一种重要的技术&#xff0c;广泛应用于噪声消除、回声消除和信号恢复等任务。LMS&#xff08;Least Mean Squares&#xff09;算法是实现自适应滤波的经典方法之一。本文将详细介绍…

如何在分布式环境中实现高可靠性分布式锁

目录 一、简单了解分布式锁 &#xff08;一&#xff09;分布式锁&#xff1a;应对分布式环境的同步挑战 &#xff08;二&#xff09;分布式锁的实现方式 &#xff08;三&#xff09;分布式锁的使用场景 &#xff08;四&#xff09;分布式锁需满足的特点 二、Redis 实现分…

socket连接封装

效果&#xff1a; class websocketMessage {constructor(params) {this.params params; // 传入的参数this.socket null;this.lockReconnect false; // 重连的锁this.socketTimer null; // 心跳this.lockTimer null; // 重连this.timeout 3000; // 发送消息this.callbac…

基于RM开发板32学习日记

环境配置 芯片选型 STM32F407IGH6 配置时钟 12 168 模块 Led 引脚选择 比对原理图 可查看 设置为Out_Put输出 三色同时点亮 合为白色光 HAL_GPIO_WritePin(LED_R_GPIO_Port, LED_R_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);GPIOH->ODR…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…

刷题笔记15

问题描述 小M和小F在玩飞行棋。游戏结束后&#xff0c;他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子&#xff0c;每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组&#xff0c;每组恰好5个&#xff0c;并且组内棋子的序号相同。小M希望知道是否可以按照这…

stm32 指定变量存储地址

uint8_t array[10] attribute((at(0x20000000))) 当你使用 attribute((at(地址))) 强制将变量放置在特定地址时&#xff0c;编译器和链接器通常不会自动调整其他变量的地址以避免冲突。这意味着&#xff0c;如果指定的地址已经被其他变量占用&#xff0c;就会发生冲突。 如果…

性能超越Spark 13.3 倍,比某MPP整体快数十秒 | 多项性能指标数倍于主流开源引擎 | 云器科技发布性能测试报告

云器Lakehouse正式发布性能测试报告 &#x1f3c5;离线批处理&#xff1a;在复杂批处理任务中&#xff0c;云器Lakehouse相较Spark表现出13.31倍性能提升。 &#x1f3c5;即席查询&#xff1a;在交互式分析场景下&#xff0c;云器Lakehouse相较Trino表现出9.84倍性能提升。 &am…

NIST 发布后量子密码学转型战略草案

美国国家标准与技术研究所 (NIST) 发布了其初步战略草案&#xff0c;即内部报告 (IR) 8547&#xff0c;标题为“向后量子密码标准过渡”。 该草案概述了 NIST 从当前易受量子计算攻击的加密算法迁移到抗量子替代算法的战略。该草案于 2024 年 11 月 12 日发布&#xff0c;开放…

论文阅读——Performance Evaluation of Passive Tag to Tag Communications(一)

文章目录 摘要一、互耦对监听器标签输入阻抗的影响A. 无限细偶极子互阻抗的理论研究B. 电细偶极子的情况&#xff1a;理论与模拟C. 印刷偶极子的情况&#xff1a;电磁模拟与测量 二、T2T 通信系统的性能评估总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/970…

IT人员面试重点底层逻辑概念

arrayList的底层原理 ArrayList是个动态数组&#xff0c;实现List接口&#xff0c;主要用来存储数据&#xff0c;如果存储基本类型的数据&#xff0c;如int&#xff0c;long&#xff0c;boolean&#xff0c;short&#xff0c;byte&#xff0c;那只存储它们对应的包装类。 它的…

PyTorch 分布式并行计算

0. Abstract 使用 PyTorch 进行多卡训练, 最简单的是 DataParallel, 仅仅添加一两行代码就可以使模型在多张 GPU 上并行地计算. 但它是比较老的方法, 官方推荐使用新的 Distributed Data Parallel, 更加灵活与强大: 1. Distributed Data Parallel (DDP) 从一个简单的非分布…

基于MATLAB的超宽带(UWB)信号的仿真和测试系统

基于MATLAB的超宽带(UWB)信号的仿真和测试系统 引言 随着无线通信技术的发展&#xff0c;超宽带&#xff08;Ultra-Wideband, UWB&#xff09;技术因其高数据传输速率、低功耗、抗多径衰落等优点而受到广泛关注。UWB技术适用于短距离高速数据传输&#xff0c;如个人区域网络、…

美团面试:有哪些情况会产生死锁

前言 我们首先需要知道&#xff0c;死锁一定发生在并发场景中。为了保证线程安全&#xff0c;有时会给程序使用各种能保证并发安全的工具&#xff0c;尤其是锁&#xff0c;但是如果在加解锁过程中处理不恰当&#xff0c;就有可能适得其反&#xff0c;导致程序出现死锁的情况。…

如何在Linux上安装Canal同步工具

1. 下载安装包 所用到的安装包 canal.admin-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1B1LxZUZsKVaHvoSx6VV3sA 提取码&#xff1a;v7ta canal.deployer-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/13RSqPinzgaaYQUyo9D8ZCQ 提取码&#xff1a;…

百度主动推送可以提升抓取,它能提升索引量吗?

站长在建站SEO的时候&#xff0c;需要用到百度站长平台&#xff08;资源平台&#xff09;的工具&#xff0c;在站长工具中【普通收录】-【资源提交】-【API提交】这个功能&#xff0c;对网站的抓取进行一个提交。 这里估计很多站长就有疑问&#xff0c;如果我主动推送&#xf…

如何将Latex的文章内容快速用word+Endnote排版

1 第一步 Endnote文件是无法直接导入bib文件的。需要将reference.bib的参考文献内容&#xff0c;通过JabRef软件打开并另存为refefence.ris文件 下载JabRef软件&#xff1a;https://www.jabref.org/#download 导出为ris格式文件 2 第二步 通过Endnote导入ris文件&#xff0…

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…