第三章:字符串、向量和数组
来源:互联网 发布:linux mkdir函数 编辑:程序博客网 时间:2024/05/18 20:35
3.1 命名空间的using声明
1、以命名空间std为例,两种声明方式:
(1)using std::cin;(或cout,endl等)
(2)using namespace std;
2、头文件中不应包含using声明。
3.2 标准库类型string
1、初始化的方式分为拷贝初始化(使用等号)与直接初始化(不使用等号)。
2、使用getline读取一整行(直接读只会读一个单词,从第一个不是空白符的字符开始,直到遇到空白符就停),其中getline会读入换行符,但是不会把它写入目标对象。
3、string的size()函数返回类型是string::size_type类型,允许编译器通过auto或者decltype来推断变量的类型。
4、当把string对象和字符字面值或字符串字面值相加时,必须确保每个加法运算符的两侧运算对象至少有一个是string。注意:字符串字面值并不是string对象。
5、建议:使用C++版本的C标准库头文件(P82)
6、范围for语句:P82
7、在范围for循环中,如果想改变string对象中字符的值,必须将循环变量定义为引用类型。
8、可使用下标访问字符串中的字符,使用超出范围的下标将引发不可预知的结果,以此推断,使用下标访问空string也会引发不可预知的结果。
9、关于string对象是否以空字符'\0'结尾,我还没有搞清楚......
3.3 标准库类型vector
1、vector是一个类模板,使用vector时我们需要提供一些额外信息(存放对象的类型)来指定模板到底实例化成什么样的类。
2、初始化vector时,编译器会综合初始化的形式(圆括号or花括号)以及传递的参数类型,来确定执行何种初始化。(P89:列表初始化还是元素数量?)
3、向vector中添加元素:push_back函数。比较好的做法是:开始时先创建空的vector对象,运行时再动态添加元素。需要注意的是,对于循环,如果循环体内包含有向vector对象添加元素的语句,则不能使用范围for循环。
4、不能用下标形式添加元素!只能对确知已存在的元素执行下标操作!确保下标合法的一种有效手段就是尽可能使用范围for语句。(P94)
3.4 迭代器介绍
1、如果容器为空,则begin和end返回的是同一个迭代器,都是尾后迭代器(指向容器“尾元素的下一位置”)。
2、P97:关键概念:泛型编程。C++程序员在for循环中习惯性地使用!=而不用<,其原因和他们更愿意使用迭代器而非下标的原因一样:因为这种编程风格在标准库提供的所有容器上都有效。
3、C++11新增cbegin和cend函数,他们返回const_iterator类型(迭代器只能读元素,不能写元素)。
4、箭头运算符:将解引用和成员访问两个操作结合在一起:it→mem等价于(*it).mem。
5、任何可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。
3.5-3.6 数组与多维数组
1、数组的维度必须是一个常量表达式。
2、用字符串字面值初始化字符数组时,要注意字符串字面值结尾还有一个空字符,字符数组需要有足够的容量存储这个空字符。
3、不能将数组的内容拷贝给其他数组作为其初始值,也不能用数组为其他数组赋值。一些编译器支持数组的赋值,这就是所谓的编译器扩展(compiler extension)。但一般来说,最好避免使用非标准特性,因为含有非标准特性的程序很可能在其他编译器上无法正常工作。
4、要想理解数组声明的含义,最好的办法是从数组的名字开始按照由内向外的顺序阅读。
5、在大多数表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
6、当数组作为一个auto变量的初始值时,推断得到的类型是指针;当使用decltype关键字时,返回类型是数组。
7、只要两个指针指向同一个数组的元素,或者指向该数组的尾元素的下一位置,就能利用关系运算符进行比较。如果两个指针分别指向不相关的对象,则不能比较它们。
8、对大多数应用来说,使用标准库string要比使用C风格字符串更安全、更高效。
9、建议:尽量使用标准库类型而非数组(P112)
9、要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型(P114)
10、使用for循环遍历多维数组时,类型判断是个很麻烦的事(尤其是涉及指针时)。可以利用auto,decltype或者类型别名来处理这样的事情(P115-P116)
作业题
练习3.26:不存在迭代器+迭代器的运算。
练习3.34:程序的功能等同于p2 = p1。在p1本身是常量,即顶层const时,该程序是非法的。
练习3.43:代码如下:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
for (int (&row)[4] : ia) {
for (int col : row)
cout << col << " ";
cout << endl;
}
for (size_t row = 0; row != 3; row++) {
for (size_t col = 0; col != 4; col++)
cout << ia[row][col] << " ";
cout << endl;
}
for (int(*row)[4] = ia; row != ia + 3; row++) {
for (int *col = *row; col != *row + 4; col++)
cout << *col << " ";
cout << endl;
}
}
#include <string>
using namespace std;
int main()
{
int ia[3][4] = { 0,1,2,3,4,5,6,7,8,9,10,11 };
for (int (&row)[4] : ia) {
for (int col : row)
cout << col << " ";
cout << endl;
}
for (size_t row = 0; row != 3; row++) {
for (size_t col = 0; col != 4; col++)
cout << ia[row][col] << " ";
cout << endl;
}
for (int(*row)[4] = ia; row != ia + 3; row++) {
for (int *col = *row; col != *row + 4; col++)
cout << *col << " ";
cout << endl;
}
}
0 0
- 第三章 字符串、向量和数组
- 第三章 字符串、向量和数组
- 第三章 字符串、向量和数组
- 第三章 字符串、向量和数组
- 第三章 字符串、向量和数组
- 第三章:字符串、向量和数组
- 第三章 字符串、向量、数组
- 第三章字符串,向量,数组
- 第三章 字符串 向量 数组
- C++学习笔记 | 第三章 字符串、向量和数组 | (1)
- [C++ primer]第三章笔记--字符串、向量和数组
- C++ Primer | 第三章 字符串、向量和数组
- 第三章 字符串、向量和数组(重点)
- C++ Primer 第三章 字符串、向量和数组
- 字符串、向量和数组
- C++ Primer中文版(第五版)--第三章 字符串、向量和数组
- 《C++primer(第五版)》学习之路-第三章:字符串、向量和数组
- C++ Primer学习笔记之第三章--字符串,向量和数组
- springboot-内置tomcat
- 基于TV模型的image inpainting算法
- 全排列延伸编程题目
- HttpCallUtil
- 发现一个不错的博客
- 第三章:字符串、向量和数组
- 线段树--区间合并hdu--1540
- JavaScript的执行上下文(与上下文不同,此点常被混淆)
- 人脸检测中误检漏检
- 四种控制事务的方法
- java中类的加载顺序
- 点击增加输入框,可删除,类似投票选项增加
- hive jdbc连接
- x265-2.4版本编译问题 error C2668: “pow”: 对重载函数的调用不明确