STL提供了六大组件
Standard Template Library
容器:Containers 各种数据结构,如 vector,list,deque,set,mep等。容器是类模板。 在声明容器变量时,可以指定容器将保存的元素的类型
算法:各种常用的算法,提供了执行各种操作的方式,包括对容器内容执行初始化,排序,搜索和转换等操作,比如sort,search,copy,erase。
仿函数:Functors 也成函数对象,行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class或者class template。
迭代器:Iterators 迭代器用于遍历对象集合的元素,扮演容器与算法之间的胶合剂,是所谓的"泛型指针",一共有五种类型,以及其他衍生变换。
适配器:Adaptors 一种修饰容器或者仿函数或迭代器接口的东西。例如:STL提供的queue和stack,就是一种空间适配器,因为他们底部完全借助于deque。
分配器:Allocators 也成为空间配置器,负责空间的配置与管理
容器 和 算法 是通过 迭代器 进行关联的 ;
STL 的实现
C++的模板为泛型程序设计奠定了关键的基础 以一种类型参数化(type parameterized)的方式实现的
STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,
STL 的使用
容器元素的需求
map或unordered_map,
01.key为自定义类对象或指针时,需要为map提供哈希函数和比较函数
02.函数对象(Functor)是一种重载了函数调用运算符(operator())的类,可以像函数一样被调用
例如:
map中有4个参数,
前两个参数是key和val的类型,
第三个参数表示比较的仿函数,用于对键值进行比较,默认情况下采用less<Key>,
自定义类中重载<运算符 或者显式的传入一个比较仿函数,或者普通函数,或者定义一个lambda表达式
第四个参数表示分配器的类型,用于分配和管理内存
unordered_map有5个参数,自定义类型作为unordered_map的key
前两个参数是key和val的类型,
第三个参数是一个哈希函数,表示用于计算哈希值,
第四个参数是比较函数,用于判断两个键是否相等,
第五个参数是分配器类型
方法1:在类中重载==操作符并且自定哈希函数
方法2:自定义比较(可以是普通的函数,仿函数,lambda表达式)并且自定义哈希函数
使用自定义结构体,需要重载hash函数和equal函数
C++ using的使用
C++中的Using的四种用法
01.命名空间(Namespace) using namespace std;
02..别名声明(Alias Declaration) using MyInt = int;
03.函数重载(Function Overloading) using MyClass::foo;
04.模板使用(Template Using)using关键字还可以用于引入模板特化
模板
C++中,模板是一种用于生成泛型类型或函数的机制
template是声明模板的关键字,告诉编译器开始泛型编程
01. 模板的两种声明:
template<class T>
//or
template<typename T>
02.类型:函数模板 与 类模板
03.模板特化(Template Specialization)
C++中,模板类和模板函数是不能进行分离编译的
结构体
struct
结构体
结构体变量的首地址:
1.结构体变量的地址就是结构体的首地址
2.结构体第一个成员的地址就是结构体的首地址
结构体: 元素可以是异质的,默认是public的
结构体数组-结构体指针-结构体嵌套,结构体作为函数参数(传值 传地址)
结构体被设计成主要用于组织数据
C++类型系统
C++的类型系统非常丰富和复杂,它包括标量类型(Scalar Type)、
复合类型(Compound Type)、标准布局类型(Standard Layout Type)、平凡类型(Trivial Type)和聚合类型(Aggregate Type)
标量类型和复合类型:这是C++类型系统的基础。
标量类型包括算术类型(整数、浮点数等)、枚举类型和指针类型。
复合类型包括数组、函数、类、结构、联合和引用。理解这些类型是编写任何C++代码的基础。
标准布局类型:这种类型的内存布局与C兼容,
这意味着你可以在C++和C之间安全地传递这种类型的对象。这对于与C语言库进行交互或编写需要与C兼容的代码非常重要。
平凡类型:平凡类型的对象可以通过简单的内存复制来创建和销毁。
这使得它们在性能敏感的代码中非常有用,因为它们的创建和销毁通常比非平凡类型的对象更快。
POD类型:POD类型是标准布局类型和平凡类型的交集。
这种类型的对象可以通过简单的内存复制来创建和销毁,并且其内存布局与C语言兼容。这使得POD类型非常适合用于与C语言代码的互操作,
以及用于需要直接控制对象内存布局的场合。
聚合类型:聚合类型是一种可以使用花括号初始化的类型。
这使得它们在需要初始化多个成员的情况下非常有用,因为你可以在一个表达式中指定所有成员的值。
POD
POD 是 C++中 Plain Old Data 的缩写,
指的是可以通过简单内存复制进行复制和传输的数据类型。
这表示该类型与用于 C 程序语言的类型兼容,即它能直接以二进制形式与 C 库交互
C定义的基本数据类型比如int、char、float、枚举、指针、数组和结构等通过二进制拷贝后还能保持数据不变,
即编译器可以通过二进制数据将该类型正确解析出来。
C++中的类类型引入了继承和派生等新概念,编译器无法解析这些复杂数据结构,
因此C++提出POD数据结构的概念用于兼容C语言,
由于C++中基本内置类型都是POD类型,
一般讨论class、struct和union是否是POD类型的。
1.
默认的构造函数与析构函数
默认的拷贝构造函数和移动构造函数
默认的拷贝赋值运算符和移动赋值运算符
不能包含虚函数和虚基类
2.标准布局
“布局”是指类、结构或联合类型的对象的成员在内存中的排列方式
参考
C++中的POD类型 https://cloud.tencent.com/developer/article/1814242
标签:函数,STL,C++,类型,组件,POD,模板
From: https://www.cnblogs.com/ytwang/p/18126383