标签搜索

目 录CONTENT

文章目录

C++中的STL.md

小小城
2021-08-22 / 0 评论 / 0 点赞 / 4 阅读 / 2,559 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

C++中的STL

@[toc]

一、什么是STL

  •  1.STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架

  •  2.STL的发展史

  • 原始版本
    Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有STL实现版本的始祖

  • P. J. 版本
    由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,
    符号命名比较怪异。

  • RW版本
    由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。

  • SGI版本
    由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高

二、STL的六大组件

在这里插入图片描述

  •  容器:
  • 用来存放数据的一种数据结构,本质上容器就是对数据结构的封装,方便使用该数据结构来管理数据
  • STL中的容器,可以划分为两大类:序列式容器和关联式容器
    在这里插入图片描述
  •  算法
  • 算法:问题的求解步骤,以有限的步骤,解决数学或逻辑中的问题。
  • STL中的算法主要分为两大类:与数据结构相关算法(容器中的成员函数)和通用算法(与数据结构不相干)。
  • STL中通用算法总共有70多个,主要包含:排序,查找,排列组合,数据移动,拷贝,删除,比较组合,运算等
算法名称算法功能
accumulate元素统计
binary_search二分查找
copy拷贝
copy_backward逆向拷贝
copy_n拷贝n个元素
count计数
count_if在特定条件下计数
equal判断两个区间相等与否
fill填充元素
fill_n填充元素n次
find循环查找
find_if循环查找符合特定条件元素
find_end查找某个子序列的最后一次出现点
find_first_of查找某个元素首次出现点
for_each对区间内的每隔一元素实行某种操作
is_heap判断某区间是否为一个heap
is_sorted判断某区间是否已排序
lexicographical_compare以字典顺序进行比较
max获取最大值
max_element最大值所在位置
merge合并两个序列
min获取最小值
min_element最小值所在位置
next_permutation获取下一个排列组合
pre_permutation获取前一个排列组合
partial_sort局部排序
partial_sum局部求和
partition分割
remove删除某类元素
remove_copy删除某类元素并将结果拷贝到另一个容器中
remove_if有条件的删除某类元素
replace替换某类元素
replace_if有条件的替换
reverse反转序列
sort排序(不稳定)
stable_partition分割并保持元素的相对次序
stable_sort分割并保持相等元素的相对位置(稳定排序算法)
unique取出重复性元素
make_heap创建堆
push_heap堆插入
pop_heap堆删除
sort_heap堆排序
  •  迭代器
  • 迭代器是一种设计模式,让用户通过特定的接口访问容器的数据,不需要了解容器内部的底层数据结构。
  • C++中迭代器本质:是一个指针,让该指针按照具体的结构去操作容器中的数据。
  •  适配器
  • 适配器:又接着配接器,是一种设计模式,简单的说:需要的东西就在眼前,但是由于接口不对而无法使用,需要对其接口进行转化以方便使用。
  • 即:将一个类的接口转换成用户希望的另一个类的接口,使原本接口不兼容的类可以一起工作

STL中适配器总共有三种类型:

  • 容器适配器-stack和queue
  • 迭代器适配器-反向迭代器
  • 函数适配器
    函数适配器
  •  仿函数
  • 仿函数:一种具有函数特征的对象,调用者可以像函数一样使用该对象 ,为了能够“行为类似函数”,该对象所在类必须自定义函数调用运算符operator(),重载该运算符后,就可在仿函数对象的后面加上一对小括号,以此调用仿函数所定义的operator()操作,就其行为而言,“仿函数”一次更切贴。
  • 仿函数一般配合算法,作用就是:提高算法的灵活性
#include <vector>
#include <algorithm>
class Mul2
{
public:
	void operator()(int& data)
	{ data <<= 1;}
};

class Mod3
{
public:
	bool operator()(int data)
	{ return 0 == data % 3;}
};

int main()
{
	// 给容器中每个元素乘2
	vector<int> v{1,2,3,4,5,6,7,8,9,0};
	for_each(v.begin(), v.end(), Mul2());
	for (auto e : v)
		cout << e << " ";
	cout << endl;
	// 删除容器中3的倍数
	auto pos = remove_if(v.begin(), v.end(), Mod3());
	v.erase(pos, v.end());
	// 将容器中的元素打印出来
	// 注意:对于功能简单的操作,可以使用C++11提供的lambda表达式来代替
	// lambda表达式实现简单,其在底层与仿函数的原理相同,编译器会将lambda表达式转换为仿函数
	for_each(v.begin(), v.end(), [](int data){cout << data << " "; });
	cout << endl;
	return 0;
}
  •  空间配置器
  • 空间配置器,顾名思义就是为各个容器高效的管理空间(空间的申请与回收)的,在默默地工作
  • 虽然在常规使用STL时,可能用不到它,但站在学习研究的角度,学习它的实现原理对我们有很大的帮助
0

评论区