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

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 的使用 


http://www.kler.cn/a/405740.html

相关文章:

  • ROS之什么是Node节点和Package包?
  • Consumer Group
  • 学习日志015--python单链表
  • tomcat 后台部署 war 包 getshell
  • PH热榜 | 2024-11-22
  • 【数据结构】【线性表】【练习】反转链表
  • 标题gitLab如何打标签
  • DASCTF 2024 10月 Reverse 完成笔记 附题目
  • 红帽RHCSA认证怎么报名?红帽初级认证报考指南!
  • 【单点知识】基于PyTorch讲解自动编码器(Autoencoder)
  • 【数据分享】中国价格统计年鉴(2013-2024) PDF
  • 区块链安全常见的攻击——自毁漏洞(Self-Destruct Vulnerability)【2】
  • C++
  • Vue3 使用v-for 渲染列表数据后更新
  • SQLSever显示物理和逻辑 IO活动量的相关信息及显示分析、编译和执行各语句所需的毫秒数。
  • vue2 src_消息订阅和发布(pubsub-js)
  • 冲破AI 浪潮冲击下的 迷茫与焦虑
  • C语言字符串搜索函数
  • MATLAB读入不同类型图像并显示图像和相关信息
  • springboot基于微信小程序的农产品交易平台
  • uni-app 玩转条件编译:自定义平台的条件编译实战详解
  • 微软 Ignite 2024 大会
  • CSS查缺补漏(补充上一条)
  • [C#] Bgr24彩色位图转为Gray8灰度位图的跨平台SIMD硬件加速向量算法
  • JDK1.8中JVM堆内存等参数配置
  • 微信小程序自定义图片预览操作按钮(解决api预览时不能删除提交服务器等自定义操作)