🥥 类成员指针
type
status
date
slug
summary
tags
category
icon
password
Property

 
成员指针(pointer to member)是指可以指向类的非静态成员的指针。一般情况下,指针可以指向一个对象,但是成员指针指的是类的成员,而非类的对象。
类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别。
成员指针的类型囊括了类的类型以及成员的类型。当初始化一个这样的指针时,令其指向类的某个成员,但是不指定该成员所属的对象:直到使用成员指针时,才提供成员所属的对象。
 

数据成员指针

和其他指针一样,在声明成员指针时也可以使用*来表示当前声明的名字是一个指针。与普通指针不同的是,成员指针还必须包含成员所属的类。因此,必须在*之前添加classname:: ,以表示当前定义的指针可以指向classname的成员。例如:
🥑 IO类
type
status
date
slug
summary
tags
category
icon
password
Property

 

C语言的输入输出

C语言中用到的最频繁的输入输出方式就是scanf()printf()
  • scanf()从标准输入设备(键盘)读取数据,并将值存放在变量中
  • printf()将指定的文字/字符串输出到标准输出设备(屏幕),使用时注意宽度输出和精度输出控制。
输入输出缓冲区:
  1. 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
  1. 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
🥑 文件输入输出
type
status
date
slug
summary
tags
category
icon
password
Property
🥑
目录

 
 
头文件fstream定义了三个类型来支持文件IO:ifstream 从给定文件读取数据,ofstream 向指定文件写入数据,fstream 可以同时读写指定文件。
notion image
这些类型提供的操作与对象cincout的操作一样。可以用IO运算符(<<>>)来读写文件,可以用getline从一个ifstream读取数据。
 
除了继承自iostream类型的行为之外,fstream中定义的类型还增加了一些新的成员来管理与流关联的文件。下表列出了这些操作,可以对fstreamifstreamofstream对象调用这些操作,但不能对其他IO类型调用这些操作:
notion image
🥑 string流
type
status
date
slug
summary
tags
category
icon
password
Property
 
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,有如下两种方法:
虽然上述俩函数都能够完成整型到字符串的转化,但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
 
C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件<sstream>。在该头文件下,标准库有如下三个类:
notion image
istringstreamstring读取数据,ostringstreamstring 写入数据,stringstream 可以同时读写 string 的数据。
🥑 IO格式化
type
status
date
slug
summary
tags
category
icon
password
Property
 
iostream对象还维护一个格式状态来控制IO如何格式化,如整型值是几进制、浮点数的精度、一个输出元素的宽度等。标准库定义了一组操纵符修改流的格式状态,一个操纵符是一个函数或对象,会影响流的状态,并能用作有输入或输出运算符的运算对象,并且操纵符和输入输出运算符一样返回它所处理的流对象,因此可以在一条语句中组合数据和操纵符。
 
endl是一个操纵符,将它“写入”输出流,就像它是一个值一样,但它不是值,而是一个操作,它输出换行符并刷新缓冲区。
大多改变格式状态的操纵符都是设置/复原成对的。操纵符改变状态后,对后续所有IO都生效。
 
打印布尔值时,会打印出1和0,可以用boolalpha操纵符打印出truefalse
 
IO整型值时使用十进制,可以用hexoctdec改变它:
在输出中不知道打印的是几进制,可以使用showbase操纵符输出进制信息:
 STL 标准模板库
type
status
date
slug
summary
tags
category
icon
password
Property
 
STL诞生
  • 长久以来,软件界一直希望建立一种可重复利用的东西。
  • C++的面向对象和泛型编程思想,目的就是复用性的提升。
  • 大多数情况下,数据结构和算法都未能有一套标准,导致被迫从事大量重复工作。
  • 为了建立数据结构和算法的一套标准,诞生了STL(Standard Template Library,标准模板库)
 
STL 从广义上分为:容器(container)、算法(algorithm)、迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。
notion image
STL的六大组件:
  • 容器
    • 容器分为序列式容器和关联式容器,即线性和非线性的数据结构。
🍆 顺序容器
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
顺序容器类型
notion image
一个容器就是一些特定类型对象的集合。所有顺序容器(sequential container) 都为程序员提供了快速顺序访问元素的能力。但是这些容器在以下方面都有不同的性能折中:
  • 向容器添加或从容器中删除元素的代价
  • 非顺序访问容器中元素的代价
 
除了固定大小的array外,其他容器都提供高效、灵活的内存管理:
  • stringvector将元素保存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在中间位置添加或删除元素就会非常耗时:在一次插入或删除操作后,需要移动插入/删除位置之后的所有元素,来保持连续存储。而且添加一个元素有时可能还需要分配额外的存储空间。在这种情况下,每个元素都必须移动到新的存储空间中。
  • listforward_list两个容器的设计目的是令容器任何位置的添加和删除操作都很快速。作为代价,这两个容器不支持元素的随机访问:为了访问一个元素,只能遍历整个容器。且与vectordequearray相比, 这两个容器的额外内存开销也很大
  • deque是一个更为复杂的数据结构。与stringvector类似,deque支持快速的随机访问。与strìngvector一样,在deque的中间位置添加或删除元素的代价(可能)很高。但是,在deque的两端添加或删除元素都是很快的,与listforward_list添加删除元素的速度相当
🍆 容器库共同操作
type
status
date
slug
summary
tags
category
icon
password
Property
🍆
目录

 
通常每个容器定义在与其名字相同的头文件中。deque定义在 <deque> 头文件中,list定义在 <list> 头文件中。容器都是类模板。与 vector一样,使用时必须提供额外的信息来生成特定的容器类型。对于绝大部分容器来说,还需提供的是元素的类型: 
 
容器类型上的操作形成了一种层次:
  • 某些操作是所有容器类型都提供的
  • 一些操作仅针对顺序容器、关联容器或无序容器
  • 还有一些操作只适用于一小部分容器
🍆 顺序容器操作
type
status
date
slug
summary
tags
category
icon
password
Property

 
顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系到了元素如何存储、访问、添加以及删除。
 

向顺序容器添加元素

array 外,所有标准库容器都提供灵活的内存管理,在运行时可以动态添加或删除元素。
notion image
当使用这些操作时,必须记得不同容器使用不同的策略来分配元素空间,而这些策略直接影响性能。在一个vectorstring的尾部之外的任何位置,或是一个deque的首尾之外的任何位置添加元素,都需要移动元素。而且,向一个vectorstring添加元素可能引起整个对象存储空间的重新分配。重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中。
 
🍆 额外的string操作
type
status
date
slug
summary
tags
category
icon
password
Property

 
string 类型在共同的顺序容器操作之外还提供了很多额外的操作。其中的大部分操作要么是提供 sting 与 C 风格字符数组之间的交互,要么是提供使用索引而不是迭代器来操作string
string 库提供了大量的函数,幸运的是,这些函数有着重复的模式。
 

构造string的其他方法

构造 string 的其他方法:
notion image
这些构造函数接受一个stringconst char*为参数,还可以接受一个额外的可选参数来指定需要拷贝的字符。当传入string时,还需要指定开始拷贝的字符的索引,如:
🍆 容器适配器
type
status
date
slug
summary
tags
category
icon
password
Property

 
标准库还定义了 stackqueuepriority_queue 三种容器适配器。容器适配器可以改变已有容器的工作机制。
所有容器适配器都支持的操作和类型:
notion image

定义一个适配器

每个适配都定义了两个构造函数:默认构造函数以创建一个空的对象,以及接收一个容器的构造函数并将适配器初始化为给定容器的拷贝。如假设 deq 是 deque<int> 可以将 deq 用于初始化 stack
默认情况下,stackqueue 是基于 deque 实现的,priority_queue 是基于 vector 实现的。可以在创建适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。
🥕 关联容器
type
status
date
slug
summary
tags
category
icon
password
Property
🥕
目录

 
关联容器支持高效的关键字查找和访问操作,2个主要的关联容器(associative-container)类型是 mapset
  • map 中的元素是一些键值对(key-value):关键字起索引作用,值表示与索引相关联的数据。
  • set 中每个元素只包含一个关键字,支持高效的关键字查询操作:检查一个给定关键字是否在 set 中。
 
标准库提供了8个关联容器,它们之间的不同体现在三个方面:
  • map 还是 set 类型
  • 是否允许保存重复的关键字