说明:本篇重在总结“ 处理string对象中的字符 ”、“ 处理vector对象中的元素 ”以及“ 多维数组的遍历 ”
文章目录
标准库类型string
初始化string对象中少见的方式
string s2(s1) // s2为s1副本
string s3("value") // 出去字符串最后的空字符
string s4(n, 'c') // n个'c'组成字符串
string成员函数size()的返回类型
size函数返回string对象的长度,返回的值为string::size_type类型。虽然可以通过auto或者decltype来推断size()的返回值类型,但是知道它能帮助理解代码。
处理string对象中的字符
一、基于范围for语句(处理每个字符)
范围for语句遍历给定序列中的每个元素,并对序列中的每个值执行某种操作,其语法形式为:
for(declaration: expression)
statement
declaration部分定义一个变量用于访问序列中的基础元素,该变量的类型可用auto推断,直接声明时应与序列中的基础元素类型相同。
(1)只读
string str("some string");
for (auto c : str) // 此处 c的类型为 char
cout << c << endl;
(2)可读可写
要改变string对象中字符的值,必须把循环变量定义成引用类型。
string s ("Hello, World!!!");
for (auto &c : s) // c的类型为char的引用
c = toupper(c); // 将字符全部转换成大写
cout << s << endl; // 输出为HELLO WORLD!!!
二、下标索引(允许只处理一部分字符)
下标运算符[ ]接收参数的类型与 s.size()返回值类型相同,为 string::size_type
/*依次处理s中的字符直至处理完全部字符或遇到一个空白*/
string s("some string");
for (decltype (s.size()) index = 0; // 此处也可使用 auto
index != s.size() && !isspace(s[index]); ++index)
s[index] = toupper (s[index]);
cout << s << endl; // 输出:SOME string
// 索引index的类型与 s.size()返回值类型相同,为 string::size_type
三、迭代器(允许只处理一部分字符)
其中成员函数begin返回指向第一个元素的迭代器,end成员返回指向“尾元素下一位置”的迭代器,常称为尾后迭代器。
迭代器类型:
string::iterator it; // it能读写string对象中的字符
string::const_iterator it2; // it2只能读字符,不能写字符
/*依次处理s中的字符直至处理完全部字符或遇到一个空白*/
string s("some string");
for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it) // it的类型为string::iterator
*it = toupper(*it);
cout << s << endl; // 输出:SOME string
标准库类型vector
初始化vector对象中少见的方式
vector<T> v2(v1) // v2包含v1所有元素的副本
vector<T> v3{a,b,c...} // v3包含初始值个数的元素,每个元素被赋予相应的初始值
vector重要操作
- v.push_back(t) // 向 v 的尾端添加一个值为 t 的元素
- v.size()// 返回 v 中元素的个数,返回值类型为vector::size_type
访问vector对象中元素的方法
访问vector对象中元素的方法和访问string对象中字符的方法差不多。
一、使用范围for语句
vector<int> v{1,2,3,4,5,6,7,8,9};
for (auto &i : v) // 对于v中的每个元素(i为int类型的引用)
i *= i; // 求元素值的平方
for (auto i : v)
cout << i << " ";
cout << endl;
二、使用下标运算符
vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 0; i < 9; i++) // 对于v中的每个元素
v[i] *= v[i]; // 求元素值的平方
for (int i = 0; i < 9; i++)
cout << v[i] << " ";
cout << endl;
三、使用迭代器
迭代器类型:
vector::iterator it; // it能读写vector的元素
vector::const_iterator it2; // it2只能读元素,不能写元素
vector<int> v{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (auto it = v.begin(); it != v.end(); it++) // 对于v中的每个元素,it类型为vector<T>::iterator it
*it *= *it; // 求元素值的平方
for (auto it = v.begin(); it != v.end(); it++)
cout << *it << " ";
cout << endl;
数组
复杂数组的声明及理解
理解数组声明含义的最好办法,是从数组的名字开始按照由内向外的顺序阅读。
int *p[10]; // p是含有10个整型指针的数组
int (*p)[10]; // p指向一个含有10个整数的数组
int (&p)[10]; // p引用一个含有10个整数的数组
访问数组元素
一、使用数组下标
下标类型为size_t,在cstddef头文件中定义。
二、使用范围for语句
三、使用指针
(1)直接定义指向数组首尾的指针
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *p = arr; // p指向arr的第一个元素
int *e = &arr[10]; // 指向arr尾元素的下一位置的指针
for(p; p < e; p++)
cout << *p << endl;
(2)使用标准库函数begin和end获得数组首尾指针
int arr[] = {0,1,2,3,4,5,6,7,8,9};
int *p = begin(arr); // p指向arr的第一个元素
int *e = end(arr); // 指向arr尾元素的下一位置的指针
for(p; p < e; p++)
cout << *p << endl;
多维数组遍历
使用范围for语句
要使用范围for语句处理多维数组,除了最内层的循环,其他所有循环的控制变量都应该是引用类型。
int a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
for (int (&row)[4] : ia) { // int (&row)[4]为一个含有4个整数数组的引用
for (int col : row)
cout << col << " ";
}
cout << endl;
使用下标运算符
int a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
for (int i = 0; i < 3; i++) { // 下标运算符接收的参数类型为size_t,int也可以。
for (int j = 0; j < 4; j++)
cout << ia[i][j] << " ";
}
cout << endl;
使用指针
int a[3][4] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
// p指向含有4个整数的数组,q指向p的首元素
for (int (*p)[4] = ia; p != ia+3; p++) {
for (int *q = *p; q != *p+4; q++)
cout << *q << " ";
}
cout << endl;
学习进度
5月8号开始,至5月18号,看完了前三章,每小节的习题基本上都码出来运行了一遍。终于看完1/8了,加油加油!!!
这个习题参考答案很不错,值得参考!