Chapter3 (字符串,向量,数组) --C++Prime笔记

1.using用法:using namespace ::name;注意事项:一般不在头文件使用using否则很容易导致运用命名空间不对错误。

2.string的方法:
①getline(输入流,string对象);注意一点是,函数从给定流读入内容,直到遇到换行符结束,(换行符也被读进来了),然后把所读的内容存入那个string对象中去(注意不存换行符

②size,size函数的返回值是string::size_type,可以确定的是这是一种无符号数,可以使用auto或者decltype来推断变量的类型。
auto len = line.size(); //len类型是string::size_type.
ps:如果一条表达式中已经有了size()函数就不要int了,避免混用有符号int和unsigned带来的问题(负数和无符号数比较时候会自动转换为一个很大的无符号数)

3.string是一种可变字符序列,其实就是一种可变长的字符数组,注意它和字符/字符串字面值不是同一类型的量。

4.当把string对象和字符串字面值混在一条语句中使用时,必须确保每个加法运算符(+)的两侧的运算对象至少有一个是string.

5.如果想改变string对象中字符的值,必须把for(declaration : expession)中的循环变量定义成引用类型。

6.用下标访问string类型变量前,都需要检查s是否为空。否则访问会导致不可预料的结果。
例子:
string s ("some string");
if(!s.empty())
{
    s[0] = toupper(s[0]);
}


7.注意点:string下标使用的注意点:大于等于0,小于等于s.size().
①总是设下标的类型为string::size_type
②满足下标小于s.size();

8.对于vector的编程要求:
①必须确保所写的循环正确无误,特别是在循环条件有可能改变vector对象容量的时候。
②如果循环体内部包含有向vector对象添加元素的语句,则不能使用范围for循环。
任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。

9.要使用vector中的size_type必须先指定它是由哪种类型定义的。vector对象的类型总是包含着元素的类型:
vector<int>::size_type  //正确
vector::size_type  //错误

10.只有当元素可以比较的时候,vector对象才可以比较。

11.vector对象(以及string对象)的下标运算可用于访问已经存在的元素,而不能用于添加元素(添加元素只能通过push_back,在不用这些方法前这个vector对象的数量都是已经定下的,因此向其中添加元素会引起访问越界。)

12.在for循环中应该要更多的使用!=判断符,而不是类似<这类的大小比较符,因为并不是所有的容器都定义了<,>,但是所有的容器都定义了== 和!=,因此这种编程风格在标准库提供的所有容器上都有效。

13.每个容器类定义了名为iterator和const_interator的类型。前者可用于常量或非常量对象,后者指的是所定义的迭代器所指的元素值不能修改,因此只能用于常量对象

14.begin和end返回的是iterator还是const_iterator由容器的类型决定,对象是常量对象,则返回const_iterator,非常量则为iterator.另外C++11中新引入了两个新函数,cbegin和cend,无论对象是常量还是非常量,这两个函数返回值都是const_iterator.

15.vector和数组的区别:数组的大小确定不变,不能随意向数组中增加元素。

16.想要理解数组的声明的含义,最好的方法就是从数组的名字开始按照由内向外的顺序阅读.
例子:
int (*Parray)[10] = &arr; //Parray指向一个含有是个int元素的数组
int (&arrRef)[10] = arr; //arrRef引用一个含有十个整数的数组
int *(&arry)[10]  = ptrs; // arry是数组的引用,该数组含有10个int型指针

17.当decltype作用于数组的时候就应该小心,
int iarr[10] = {0};
decltype(iarr)ib;
这个时候ib的定义等价于 int ib[10];两者是一样的。不要觉得ib是一个指针了,它是一个正宗的数组

18.标准库(如vector,string)限定使用的下标必须是无符号类型,而内置的下标运算所用的索引值不是无符号类型。
posted @ 2018-07-17 21:37  LyndonMario  阅读(220)  评论(0编辑  收藏  举报