《C++Primer》第三章:字符串、向量和数组

  1. 头文件不应该包含名字空间的using声明。
  2. string的size函数返回类型是size_type,这是标准库的配套类型,体现了机器无关的特性。size_type一定是unsigned的,并且足够大。在使用时,也应该用该类型的变量存放size函数的返回值。如果感觉不方便,可以使用auto或者decltype。不要一股脑用int导致出现带符号数和无符号数混用的错误。
  3. string类型支持加法操作,但是不能支持两个字符串字面值相加。因为出于与C的兼容性,C++中字符串字面值不是string类型对象。
  4. string的下标运算符接受的输入类型是size_type,数组元素的下标类型是size_t,一种机器相关的无符号类型。
  5. vector是类模板。
  1. 一个很基本的原则:range-for语句内不允许改变所遍历序列的大小。
  2. vector的下标操作只允许访问已存在的元素,如果索引一个空vector或者大于索引的长度的位置,可能不会被编译器发现,这可能导致缓冲区溢出。因此推荐使用range-for来遍历vector。
  3. C++的编程风格倾向于使用迭代器和!=来循环遍历容器,而不是下标和<。
  4. 对于迭代器中元素的类型,可以使用autodecltype,也可以使用vector::iterator或者vector::const_iterator声明一个迭代器。后者类似于常量指针。对于begin和end,返回的是iterator还是const_iterator由容器中的元素是否是const决定,而(C++11中)cbegin和cend一定返回const_iterator。
  5. 使用迭代器的时候,不要想迭代其所属的容器添加元素,否则会导致容器失效。
  6. 同一个容器的两个迭代器可以想减,得到的是difference_type类型的带符号整数。
  7. 数组与vector的区别在于大小确定,牺牲灵活性来获取性能,编译的时候必须可以确定数组的大小和类型,因此大小是一个常量表达式。不允许使用auto作为数组类型,而且同vector,其中的元素必须都是对象(不可以是引用)。
  8. 对于数组的定义,结合指针和引用可能难以阅读,比较好的方式是右括号的话从内向外阅读。
  9. 对于数组也可以使用类似于迭代器的操作,不过数组不是类类型,没有成员函数。所以可以使用全局函数beginend来获得数组的首指针和尾指针。指针同样可以进行与迭代器类似的操作,两个指针相减得到的类型是ptrdiff_t
  10. 尽量使用标准库比如vector及其迭代器而非数组与指针,使用string而非字符串数组。
本站总访问量