《C++Primer》第十一章:关联容器

  1. 使用map容器下标操作时,如果键还没有在容器中,则容器会默认创建一个新元素。如果不希望默认创建新元素,就使用find方法,返回迭代器,没有指定元素时,迭代器指向尾后元素。注意对于map来说,下标得到的结果是mapped_type类型,find得到的结果是迭代器,迭代器指向的类型是value_type。另外,set和multimap、unordered_multimap没有下标操作。
  2. map中的元素是pair类型的对象,迭代器也是只想这样的对象。数据成员名为firstsecond
  3. 关联容器的迭代器都是双向迭代器,不是随机寻址迭代器。
  4. 对于有序容器的关键字类型的限制:关键字类型必须定义元素比较的方法,严格的说是严格弱序,可以看作小于号。如果自定义类型上没有定义小于号,那么在构造函数中需要传入一个作为比较方法的函数指针。
  5. pair类型定义在标准库utility中。

Read More

《C++Primer》第十章:泛型算法

  1. 其实顺序容器之定义了很少了操作,比如添加删除、访问首尾元素、确定容器元素个数、获取迭代器。但是更多更复杂的操作,比如查找特定元素、替换或者删除一个特定值、重排元素顺序这些并没有实现为每个容器的成员函数,而是提供了一组泛型算法的接口。
  2. 大多数算法定义在algorithm中,还有一部分数值泛型算法定义在numeric中。
  3. 泛型算法本身不会执行容器的操作(甚至泛型算法接受的可能不是容器而是c-style的数组),他们只会运行在迭代器上,执行迭代器的操作。因此迭代器使得算法不依赖于容器,但是算法依赖于元素类型的操作,比如需要在元素上进行比较。所以一个很重要的原则就是,这些算法不会改变容器的大小,(但是可能改变具体的元素值或者移动元素)。
  4. 绝大多数算法通过前两个参数接受一个迭代器范围。
  5. 接受三个迭代器表示两个序列的算法中,确保第二个序列不小于第一个序列是程序员的责任。

Read More

《C++Primer》第九章:顺序容器

  1. 元素在顺序容器中的顺序与其加入容器时的位置相对应。区别于关联容器,元素的位置由元素相关联的关键字值所决定。
  2. 顺序容器包括vectordequelistforward_listarraystring。其中array是固定大小,其他的都是可变容器。
  3. 对于选择容器:
  • vector通常来说是最好的默认选择。
  • 存放大量小的元素不推荐使用list(指针的额外空间消耗)。
  • 大量的随机访问使用vector或deque。
  • 大量的随机位置的添加删除使用list。
  • 如果不确定使用哪个,那么在程序中只使用迭代器;不适用下标。这样在需要更换的时候比较方便。
  1. 容器均被定义成了模板类。
  2. 迭代器是一组良好实现的接口,用于统一操作或者访问容器。

Read More

《C++Primer》第八章:IO库

  1. 类型ifstreamistringstream都是继承自istream
  2. 可以将流作为条件使用,如while(cin>>chr)之类的操作,默认是调用了!s.fail()这个方法判断流是否处于有效状态。
  3. 直接将流作为条件使用也可以。也是判断流是否处于有效状态。一旦一个流发生错误,在其上后续的IO操作都会失败。
  4. 可以使用s.rdstate()获得流的当前状态,返回类型是strm::iostate,可能是strm::badbitstrm::failbitstrm::eofbitstrm::goodbit中的一种。
  5. return或者缓冲区满或者显式endl/flush/ends刷新缓冲区,操纵符unitbuf也可以刷新缓冲区,cerr默认立即刷新。另外当读写流时被关联的流会被刷新,比如cin/cerr关联到cout,读cin、cerr时cout会被立刻刷新。(这是因为考虑到交互式的场景,输入都会和输出关联,使得用户会看到所有输出后才会输入)
  6. 文件流对象可以用open和具体文件关联,close掉后可以重新关联新的文件。同上,open之后使用if(fstream)来检测是否成功打开是一个好习惯。

Read More

《C++Primer》第五章:语句

  1. 悬垂else与最近的尚未匹配的if语句匹配,从而消除二义性的问题。
  2. case关键字与它对应的值一起被称为case标签,case标签必须是整型常量表达式。
  3. 对于range-for语句,最好使用auto类型声明变量,如果要改变序列内元素,使用引用。
  4. 标准库异常类都有名为what的无参函数,用于输出信息。
本站总访问量