c++ primer 笔记,第八(IO库)、九章(顺序容器)

第八章

  1. 我们不能对IO对象拷贝或赋值;由于不能拷贝IO对象,所以我们不能将形参和返回类型设置为流类型,进行IO操作的函数通常以引用方式传递和返回流;读写一个IO对象会改变其状态,因此传递和返回的引用不能是const的
  2. 流有不同的状态,一个流一旦发生错误,其上后续的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);   
  3. 导致缓冲刷新的原因:
    (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间的正常关联

第九章

  1. 当将一个容器初始化另一个容器的拷贝时,两个容器的类型及其元素类型必须匹配,不过,当传递迭代器参数来拷贝i一个范围时,就不要求容器类型是相同的了
  2. 内置数组类型不能进行对象拷贝或赋值操作,但array并无此限制
  3. assign操作用参数所指定的元素(的拷贝)替换左边容器的所有元素
  4. swap两个array时会真正交换他们的元素,对于其他容器只是交换容器的内部数据结构
  5. 向一个vector、string或deque插入元素会使所有指向容器的迭代器、引用和指针失效
  6. 除array和forward_list外,所有顺序容器都支持push_back,包括string
  7. insert函数将元素插入到迭代器所指定位置之前
  8. emplace_front、emplace、emplace对应与push_front、insert、push_back,当我们调用emplace成员函数时,是将参数传递给元素类型的构造函数,emplace成员直接在指定内存空间构造元素
  9. at成员函数类似于下标元素符,但如果下标越界,at会抛出一个out_of_range异常
  10. forward_list是单向链表,我们无法访问到一个元素的前驱元素,容器提供了insert_after、emplace_after和erace_after操作,为了删除elem3,应使用指向elem2的迭代器调用erase_aafter
  11. 向迭代器添加元素或删除元素可能会使迭代器失效,因此必须保证每次改变容器的操作之后都重新定位迭代器;程序必须保证每个循环步中都更新迭代器
  12. 容器的size是指它已经保存的元素数目,capacity是在不分配内存空间的前提下它最多可以保存多少元素
  13. to_string(val) 是一组重载函数,返回val的string表示,val可以是任何算数类型
  14. 一个容器适配器接受一种已有的容器类型,使其行为看起来像一种不同的类型,stack、queue和priority_queue都是顺序容器适配器;所有适配器的偶要求容器具有添加和删除元素的能力,因此适配器不能构造在array

    // 在vector上实现的空栈
    stack<string, vector<string>> str_stk;

猜你喜欢

转载自blog.csdn.net/chuxin126/article/details/78525131