两个容器或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();|某些对vector对象的操作会是迭代器失效:1.不能在范围for循环中向vector对象添加元素,2.任何一种可能改变vector对象容量的操作都会使该对象的迭代器失效。 谨记:但凡是使用了迭代器的循环体,都不要想迭代器所属的容器添加元素。
(*it).empty();//相
it->empty(); //同(->把解引用和成员访问结合在一起)
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语句处理多维数组,出了最内层的循环外,其他所有循环的控制变量都应该是引用类型类型。