IO类
三个独立的头文件:iostream, fstream, sstream
iostream:定义了用于读写流的基本类型
fstream:定义了读写命名文件的类型
sstream:定义了读写内存string对象的类型
头文件 iostream
类型:
istream, wistream 从流读取数据
ostream, wostream 向流写入数据
iostream, wiostream 读写流
头文件 fstream
类型:
ifstream, wifstream 从文件读取数据
ofstream, wofstream 向文件读写数据
fstream, wfstream 读写文件
头文件 sstream
类型:
istringstream, wistringstream 从string读取数据
ostringstream, wostringstream 向string写入数据
stringstream, wstringstream 读写string
为了支持使用宽字符的语言,标准库定义了一组类型和对象来操纵wchar_t类型的数据。宽字符版本的类型和函数的名字以一个w开始。
概念上,设备类型和字符大小都不会影响要执行的IO操作。
标准库能忽略这些不同类型的流之间的差异,这是通过继承机制实现的。
继承机制可以声明一个特定的类继承自另一个类。通常可以将一个派生类(继承类)对象当作其基类(所继承的类)对象来使用。
一个流一旦发生错误,其上后续的IO操作都会失败。只有当一个流处于无错误状态时,才能从它读取数据,向它写入数据。
确定一个流对象的状态的最简单的方法是将它当做一个条件来使用:
while(cin>>word)
//ok:读操作成功。。。
IO库中:endl,flush和ends都可以完成刷新缓冲区。
endl:完成换行并刷新缓冲区
flush:刷新缓冲区但不输出任何额外的字符
ends:向缓冲区插入一个空字符,然后刷新缓冲区
unitbuf操作符,可以在每次输出操作后都刷新缓冲区,它告诉流在接下来的每次写操作之后都进行一次flush操作。
nounitbuf操作符,可以重置流,使其恢复使用正常的系统管理的缓冲区刷新机制:
cout<<unitbuf; //所有输出操作都会立即刷新缓冲区
//任何输出都立即刷洗,无缓冲
cout<<nounitbuf; //回到正常的缓冲方式
当一个输入流被关联到一个输出流时,任何试图从输入流读取数据的操作都会先刷新关联的输出流。
标准库将cout和cin关联在一起,
cin>>ival;
导致cout的缓冲区被刷新。
交互式系统通常应该关联输入流和输出流。这意味着所有输出,包括用户提示信息,都会在读操作之前被打印出来。
在要求使用基类型对象的地方,可以用继承类型的对象来代替。这意味着,接受一个iostream类型引用(或指针)参数的函数,
可以用一个对应的fstream(或sstream)类型来调用。
如果有一个函数接受一个ostream&参数,在调用这个函数时,可以传递给它一个ofstream对象,
对istream&和ifstream也是类似。
顺序容器
一个容器就是一些特定类型对象的集合。顺序容器提供了控制元素存储和访问顺序的能力。
这种顺序不依赖于元素的值,而是与元素加入容器时的位置相对应。
vector:可变大小数组。支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢。
deque:双端队列。支持快速随机访问。在头尾位置插入/删除速度很快。
list:双向链表。只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都很快。
forwar_list:单向链表。只支持单向顺序访问。在链表任何位置进行插入/删除操作速度都很快。
array:固定大小数组。支持快速随机访问。不能添加或删除元素。
string:与vector相似的容器,但专门用于保存字符。随机访问快。在尾部插入/删除速度快。
deque像vector一样提供了随机访问元素的能力,但它提供了vector所不支持的push_front。
deque保证在容器首尾进行插入和删除元素的操作都只花费常数时间。与vector一样,在deque
首尾之外的位置插入元素会很耗时。
容器操作可能使迭代器失效
向容器中添加元素和从容器中删除元素的操作可能会使指向容器元素的指针、引用或迭代器失效。
一个失效的指针、引用或迭代器将不再表示任何元素。
在向容器添加元素后:
如果容器是vector或string,且存储空间被重新分配,则指向容器的迭代器、指针和引用都会失效。
如果存储空间未重新分配,指向插入位置之前的元素的迭代器、指针和引用仍有效,但指向插入位置
之后元素的迭代器、指针和引用将会失效。
对于deque,插入到除首尾位置之外的任何位置都会导致迭代器、指针和引用失效。如果在首尾位置添加
元素,迭代器会失效,但指向存在的元素的引用和指针不会失效。
对于list和forward_list,指向容器的迭代器(包括尾后迭代器和首前迭代器)、指针和引用仍有效。
当删除一个元素后:
对于list和forwar_list,指向容器其他位置的迭代器(包括尾后迭代器和首前迭代器)、引用和指针仍
有效。
对于deque,如果在首尾之外的任何位置删除元素,那么指向被删除元素外其他元素的迭代器、引用或指针
也会失效。如果是删除deque的尾元素,则尾后迭代器也会失效,但其他迭代器、引用和指针不受影响;如果
是删除首元素,这些也不会受影响。
对于vector和string,指向被删除元素之前元素的迭代器、引用和指针仍有效。当删除元素时,尾后迭代器
总是会失效。