C++_STL提供了六大组件

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	  
posted @ 2024-04-10 16:50  辰令  阅读(30)  评论(0编辑  收藏  举报