c++primer第二遍阅读感悟(chap3)

时间:2022-07-19 16:45:03

两个容器或string大小的比较是比较第一个不相同的元素的大小。

3.2.2 |判断一个字符串是否是空串:用s.empty(),而不是判断s.size()是否等于0.

         |string::size_type:size函数的返回值。如果一条表达式中已经有了size()函数,就不要在使用int,可以避免和unsigned混用。

         |字面值和string对象相加:必须确保每个加法运算发的两侧的运算对象至少有一个是string。

3.2.3 |使用基于范围的for语句for(auto c : str) cout<< c<<endl;(对于处理string对象的每一个字符,是个好主意,但访问其中一个字符就要用到下标)

         |注意检查下表合法性:c++标准并不要求标准库检测下表是否合法。

3.3  |vector:|引用不是对象,所以不存在包含引用的vector。

                         |初始化时:( ) 表示个数,{  }表示元素的值,如果使用了花括号形式,但是 提供的值不能用来列表初始化,就要考虑用这样的值来构造vector对象了。

                         |vector<int>::size_type

vector对象的高效增长:在定义vector对象时设定其大小没有什么必要,如果设置了性能可能会更差。

对编写程序更高的要求:1.必须确保所写的循环正确无误,特别是在循环有可能改变vector对象容量的时候;

2.(隐含的要求)如果循环体内部包含有向vector对象添加元素的语句,则不能适用范围for循环。

提示:只能对确知已存在的元素执行下标操作(确保下标合法的一种有效手段就是尽可能使用范围for语句

3.4.1|

auto it = ivec.begin();
(*it).empty();//相
it->empty(); //同(->把解引用和成员访问结合在一起)
           |某些对vector对象的操作会是迭代器失效:1.不能在范围for循环中向vector对象添加元素,2.任何一种可能改变vector对象容量的操作都会使该对象的迭代器失效。 谨记:但凡是使用了迭代器的循环体,都不要想迭代器所属的容器添加元素。

3.4.2|difference_type:两个迭代器的距离的类型,带符号的整型数。


3.5   |数组维度必须是一个常量表达式constexpr

        |引用不是对象,所以不存在包含引用的数组

         |字符数组的特殊性:用字符串字面值对此类数组初始化时,注意结尾处还有一个空字符。“c++\0

         |理解复杂的数组声明 : 从内到外,从右到左

3.5.3|当使用decltype关键字时,ia是一个是个元素的数组:decltype(ia) ia3={0,1,2,3,4,5,6,7,8,9};

        |两个指针相减的结果的类型是一种名为ptrdiff_t 的标准库类型,cstddef头文件中。

只要指针指向的是数组中的元素(或者数组中尾元素的下一位置),都可以执行下标运算

int *p = &ia[2];
int j = p[1]; //j = ia[3]
int k = p[-2]; //k = ia[0]
                标准库类型限定使用的下标必须是无符号类型,而内置的下标运算无此要求。内置的下标可以处理负值。

3.5.4|C标准库string函数:strlen(s)  strcmp(s1,s2)   strcat(s1,s2)   strcpy(s1,s2)传入此类函数的指针必须指向以空字符作为结束的数组

3.5.5|与旧代码的接口:

          ||混用string对象和c风格字符串: const char *str = s.c_str(); 如果执行完c_str函数后程序想一直都能使用其返回的数组,最好将该数组重新拷贝一份。

          ||不允许使用一个数组为另一数组赋初值,也不允许使用vector对象初始化数组,散失允许使用数组初始化vector:  int  int_arr[] = {0,1,2,3,4,5};  vector<int> ivec(begin(int_arr), end(int_arr));


3.6  |  要使用范围for语句处理多维数组,出了最内层的循环外,其他所有循环的控制变量都应该是引用类型类型。