🥥
type
status
date
slug
summary
tags
category
icon
password
Property
目录
成员指针(pointer to member)是指可以指向类的非静态成员的指针。一般情况下,指针可以指向一个对象,但是成员指针指的是类的成员,而非类的对象。
类的静态成员不属于任何对象,因此无须特殊的指向静态成员的指针,指向静态成员的指针与普通指针没有什么区别。
成员指针的类型囊括了类的类型以及成员的类型。当初始化一个这样的指针时,令其指向类的某个成员,但是不指定该成员所属的对象:直到使用成员指针时,才提供成员所属的对象。
数据成员指针
和其他指针一样,在声明成员指针时也可以使用
*
来表示当前声明的名字是一个指针。与普通指针不同的是,成员指针还必须包含成员所属的类。因此,必须在*
之前添加classname::
,以表示当前定义的指针可以指向classname
的成员。例如:🥑
type
status
date
slug
summary
tags
category
icon
password
Property
目录
C语言的输入输出
C语言中用到的最频繁的输入输出方式就是
scanf()
和printf()
。scanf()
:从标准输入设备(键盘)读取数据,并将值存放在变量中
printf()
:将指定的文字/字符串输出到标准输出设备(屏幕),使用时注意宽度输出和精度输出控制。
输入输出缓冲区:
- 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
- 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
🥑
type
status
date
slug
summary
tags
category
icon
password
Property
目录
头文件
fstream
定义了三个类型来支持文件IO:ifstream
从给定文件读取数据,ofstream
向指定文件写入数据,fstream
可以同时读写指定文件。这些类型提供的操作与对象
cin
和cout
的操作一样。可以用IO
运算符(<<
和>>
)来读写文件,可以用getline
从一个ifstream
读取数据。除了继承自
iostream
类型的行为之外,fstream
中定义的类型还增加了一些新的成员来管理与流关联的文件。下表列出了这些操作,可以对fstream
,ifstream
和 ofstream
对象调用这些操作,但不能对其他IO
类型调用这些操作:🥑
type
status
date
slug
summary
tags
category
icon
password
Property
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,有如下两种方法:
虽然上述俩函数都能够完成整型到字符串的转化,但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。
在
C++
中,可以使用stringstream
类对象来避开此问题。在程序中如果想要使用stringstream
,必须要包含头文件<sstream>
。在该头文件下,标准库有如下三个类:istringstream
从string
读取数据,ostringstream
向 string
写入数据,stringstream
可以同时读写 string
的数据。头文件
sstream
中定义的类型都继承自iostream
头文件中定义的类型。除了继承得来的操作,sstream
中定义的类型还增加了一些成员来管理与流相关联的string
。下表列出了这些操作,可以对
stringstream
对象调用这些操作, 但不能对其他IO
类型调用这些操作:🥑
type
status
date
slug
summary
tags
category
icon
password
Property
iostream
对象还维护一个格式状态来控制IO如何格式化,如整型值是几进制、浮点数的精度、一个输出元素的宽度等。标准库定义了一组操纵符修改流的格式状态,一个操纵符是一个函数或对象,会影响流的状态,并能用作有输入或输出运算符的运算对象,并且操纵符和输入输出运算符一样返回它所处理的流对象,因此可以在一条语句中组合数据和操纵符。endl
是一个操纵符,将它“写入”输出流,就像它是一个值一样,但它不是值,而是一个操作,它输出换行符并刷新缓冲区。大多改变格式状态的操纵符都是设置/复原成对的。操纵符改变状态后,对后续所有IO都生效。
打印布尔值时,会打印出1和0,可以用
boolalpha
操纵符打印出true
和false
:IO
整型值时使用十进制,可以用hex
、oct
和dec
改变它:在输出中不知道打印的是几进制,可以使用
showbase
操纵符输出进制信息:🍆
type
status
date
slug
summary
tags
category
icon
password
Property
顺序容器类型
一个容器就是一些特定类型对象的集合。所有顺序容器(sequential container) 都为程序员提供了快速顺序访问元素的能力。但是这些容器在以下方面都有不同的性能折中:
- 向容器添加或从容器中删除元素的代价
- 非顺序访问容器中元素的代价
除了固定大小的
array
外,其他容器都提供高效、灵活的内存管理:string
和vector
将元素保存在连续的内存空间中。由于元素是连续存储的,由元素的下标来计算其地址是非常快速的。但是,在中间位置添加或删除元素就会非常耗时:在一次插入或删除操作后,需要移动插入/删除位置之后的所有元素,来保持连续存储。而且添加一个元素有时可能还需要分配额外的存储空间。在这种情况下,每个元素都必须移动到新的存储空间中。
list
和forward_list
两个容器的设计目的是令容器任何位置的添加和删除操作都很快速。作为代价,这两个容器不支持元素的随机访问:为了访问一个元素,只能遍历整个容器。且与vector
、deque
和array
相比, 这两个容器的额外内存开销也很大
deque
是一个更为复杂的数据结构。与string
和vector
类似,deque
支持快速的随机访问。与strìng
和vector
一样,在deque
的中间位置添加或删除元素的代价(可能)很高。但是,在deque
的两端添加或删除元素都是很快的,与list
或forward_list
添加删除元素的速度相当
🍆
type
status
date
slug
summary
tags
category
icon
password
Property
目录
顺序容器和关联容器的不同之处在于两者组织元素的方式。这些不同之处直接关系到了元素如何存储、访问、添加以及删除。
向顺序容器添加元素
除
array
外,所有标准库容器都提供灵活的内存管理,在运行时可以动态添加或删除元素。当使用这些操作时,必须记得不同容器使用不同的策略来分配元素空间,而这些策略直接影响性能。在一个
vector
或string
的尾部之外的任何位置,或是一个deque
的首尾之外的任何位置添加元素,都需要移动元素。而且,向一个vector
或string
添加元素可能引起整个对象存储空间的重新分配。重新分配一个对象的存储空间需要分配新的内存,并将元素从旧的空间移动到新的空间中。使用push_back
🍆
type
status
date
slug
summary
tags
category
icon
password
Property
目录
string
类型在共同的顺序容器操作之外还提供了很多额外的操作。其中的大部分操作要么是提供 sting
与 C 风格字符数组之间的交互,要么是提供使用索引而不是迭代器来操作string
。string
库提供了大量的函数,幸运的是,这些函数有着重复的模式。构造string的其他方法
构造
string
的其他方法:这些构造函数接受一个
string
或const char*
为参数,还可以接受一个额外的可选参数来指定需要拷贝的字符。当传入string
时,还需要指定开始拷贝的字符的索引,如:🍆
type
status
date
slug
summary
tags
category
icon
password
Property
目录
标准库还定义了
stack
、queue
和 priority_queue
三种容器适配器。容器适配器可以改变已有容器的工作机制。所有容器适配器都支持的操作和类型:
定义一个适配器
每个适配都定义了两个构造函数:默认构造函数以创建一个空的对象,以及接收一个容器的构造函数并将适配器初始化为给定容器的拷贝。如假设
deq
是 deque<int>
可以将 deq
用于初始化 stack
:默认情况下,
stack
和 queue
是基于 deque
实现的,priority_queue
是基于 vector
实现的。可以在创建适配器时将一个命名的顺序容器作为第二个类型参数,来重载默认容器类型。🥕
type
status
date
slug
summary
tags
category
icon
password
Property
目录
关联容器支持高效的关键字查找和访问操作,2个主要的关联容器(associative-container)类型是
map
和 set
:map
中的元素是一些键值对(key-value):关键字起索引作用,值表示与索引相关联的数据。
set
中每个元素只包含一个关键字,支持高效的关键字查询操作:检查一个给定关键字是否在set
中。
标准库提供了8个关联容器,它们之间的不同体现在三个方面:
- 是
map
还是set
类型
- 是否允许保存重复的关键字
- 是否按顺序保存元素