第八章
- 我们不能对IO对象拷贝或赋值;由于不能拷贝IO对象,所以我们不能将形参和返回类型设置为流类型,进行IO操作的函数通常以引用方式传递和返回流;读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的
流有不同的状态,一个流一旦发生错误,其上后续的IO操作都会失败;
(1)badbit表示系统级错误,如不可恢复的读写错误;
(2)发生可恢复错误failbit被置位,如期望读写数值读到了一个字符;
(3)若达到文件结束位置,eofbit和failbit都被会置位;
(4)将流当作体哦阿健使用的代码就相当于!fail();
(5)可以调用流对象的rdstate成员返回一个iostate值,对应流的当前状态;auto old_state = cin.rdstate(); //获取cin的当前状态 cin.clear(); //使cin有效 cin.setstate(old_state); //将cin置为原有状态 //复位failbit和badbit,其他标志位保持不变 cin.clear(cin.rdstate() & ~cin.failbit & ~cin.badbit);
导致缓冲刷新的原因:
(1)程序正常结束;
(2)缓冲区满时;
(3)使用操纵符如endl来显示刷新;
(4)在每个输出之后,可以使用操纵符unitbuf来设置流的内部状态来清空缓冲区,默认情况下,对cerr是设置unitbuf的;cout << unitbuf; //所有输出都立即刷新缓冲区 cout <<nounitbuf; //回到正常的缓冲方式
(5)一个输出流可能被关联到另一个流,当读写被关联的流时,关联到的流的缓冲区会被刷新;默认情况下cin和cerr都关联到cout,因此,读cin或者写cerr都会导致cout的缓冲区被率刷新
cin.tie(&cout); //将cin与cout关联在一起 ostream *old_tie = cin.tie(nullptr); //cin不再与任何流关联 cin.tie(old_tie); //重建cin和cout间的正常关联
第九章
- 当将一个容器初始化另一个容器的拷贝时,两个容器的类型及其元素类型必须匹配,不过,当传递迭代器参数来拷贝i一个范围时,就不要求容器类型是相同的了
- 内置数组类型不能进行对象拷贝或赋值操作,但array并无此限制
- assign操作用参数所指定的元素(的拷贝)替换左边容器的所有元素
- swap两个array时会真正交换他们的元素,对于其他容器只是交换容器的内部数据结构
- 向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效
- 除array和forward_list外,所有顺序容器都支持push_back,包括string
- insert函数将元素插入到迭代器所指定位置之前
- emplace_front、emplace、emplace对应与push_front、insert、push_back,当我们调用emplace成员函数时,是将参数传递给元素类型的构造函数,emplace成员直接在指定内存空间构造元素
- at成员函数类似于下标元素符,但如果下标越界,at会抛出一个out_of_range异常
- forward_list是单向链表,我们无法访问到一个元素的前驱元素,容器提供了insert_after、emplace_after和erace_after操作,为了删除elem3,应使用指向elem2的迭代器调用erase_aafter
- 向迭代器添加元素或删除元素可能会使迭代器失效,因此必须保证每次改变容器的操作之后都重新定位迭代器;程序必须保证每个循环步中都更新迭代器
- 容器的size是指它已经保存的元素数目,capacity是在不分配内存空间的前提下它最多可以保存多少元素
- to_string(val) 是一组重载函数,返回val的string表示,val可以是任何算数类型
一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型,stack、queue和priority_queue都是顺序容器适配器;所有适配器的偶要求容器具有添加和删除元素的能力,因此适配器不能构造在array
// 在vector上实现的空栈 stack<string, vector<string>> str_stk;