今天发现之前写的第一章的记录后面很多的内容都没有保存上!!太难受了,还是记录了一些过程的!之后一定要注意及时点保存草稿!不要在两个浏览器都打开草稿
本章将介绍两种最重要的标准库类型:string和vector。
3.2 标准库类型String
- 标准库类型string表示可变长的字符序列。
- string s1;//默认初始化,s1是一个空串
getline函数的参数是一个输入流和一个string对象。和输入运算符一样,getline也会返回它的流参数,也可以getline的结果作为条件。使用endl结束当前行并刷新显示缓冲区。
while(getline(cin,line))
cout<<line<<endl;
练习3.3:输入运算符自动忽略空白符,getline可以读入空白符。
range for 语句,基于范围的for语句,适用于处理每个字符的情况。只处理一部分字符的话:使用下标或者使用迭代器。
- 下标运算符([])接收的输入参数是string::size_type类型的值;返回值是该位置上字符的引用。
string对象的下标必须大于等于0而小于s.size()
练习3.7 s不会改变
练习3.9:不合法,如果s为空,则s[0]是未定义的。
练习3.11:不合法,不能给常量赋值。
3.3 标准库类型vector
vector是模板而非类型。
3.4迭代器介绍
string和vector都支持迭代器。
string s("Some String");
if(s.begin()!=s.end()){//确保s非空
auto it=s.begin();
*it=toupper(*it);
}
3.5数组
- 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。C++11新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。
- 由单括号括起来的一个字符称为char型字面值,双括号括起来的零个或多个字符则构成字符串型字面值。字符串字面值的类型实际上是由常量字符构成的数组。
- 复杂的数组声明:int (*Parray)[10]=&arr;// Parray是一个指针,它指向一个int型的数组,数组中包含10个元素。
- 在使用数组下标时,通常将其定义为size_t类型。size_t是一种机器相关的无符号类型。
- 不允许拷贝和复制
- C++11标准引入了两个名为begin和end的函数。正确的使用形式是将数组作为它们的参数。但是在VS2019没有办法使用??说是未定义的标识“begin”-------原因:没有写上using std::begin..begin是string和vector的成员,begin也是一个标准库函数。
练习3.27:a非法,buf_size不是一个常量表达式;c非法,只有当txt_size是consttexpr时正确;d非法没有空间可以存放空字符!
练习3.28:定义于任何函数体之外的变量被初始化为0。定义于函数体内部的内置类型变量将不被初始化。注意是内置类型比如int。sa和sa2里面都是空串。ia里面都是0,ia2是未定义的。
练习3.40 会被建议使用更安全的strcat_s函数
练习3.26:编写一段程序比较两个数组是否相等。再写一段程序,比较两个vector对象是否相等。
3.6 多维数组
严格的说,C++语言中没有多维数组,通常所说的多维数组其实是数组的数组。
- 在使用数组下标时,通常将其定义为size_t类型。
- string nums[={"One","two","three"};数组的元素是string对象 string *p2=nums;//等价于p2=&nums[0;
- 在很多用到数组名字的地方,编译器都会自动地将其替换为一个指向数组首元素的指针。所以多维数组名转换得来的指针实际上是指向第一个内层数组的指针。
- 使用范围for语句处理多维数组时,除了最内层的循环外,其他所有循环的控制变量都应该是引用类型。(会被转化成首元素的地址,本来的意图是希望它是一个数组对象)。
练习3.37:初始化的时候没有显示地以‘\0’结尾,程序会找到‘\0’才会结束。
指针和多维数组:
int ia[3][4];
int (*p) [4]=ia;//p指向含有4个整数的数组
p=&ia[2]; //p指向ia的尾元素
int arr[10];
int (*Parray) [10]=&arr; // Parray指向一个含有10个整数的数组
int (&arrRef) [10]=arr; //arrRef引用一个含有10个整数的数组
练习3.43:编写3个不同版本的程序,令其均能输出ia的元素。注意:不允许使用引用的数组。
我们可以推断出p的类型是指向含有4个整数的数组的指针,q的类型是指向整数的指针。
int ia[3][4] = {
{0,1,2,3},
{4, 5, 6, 7},
{8, 9, 10, 11}
};
for (int(&i)[4] : ia) {
for (int j : i)
cout << j << ' ';
cout << endl;
}
for (size_t i = 0; i < 3; i++) {
for (size_t j = 0; j < 4; j++)
cout << ia[i][j] << ' ';
cout << endl;
}
for (int(*p)[4] = ia; p != ia + 3; p++) {
for (int* q = *p; q != *p + 4; q++) //*p是内层数组首元素的指针
cout << *q << ' ';
cout << endl;
}
小结:string和vector是两种最重要的标准库类型。一般来说,应该有限选取标准库提供的类型。