《C++ Primer》第3章重点总结

说明:本篇重在总结“ 处理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了,加油加油!!!
这个习题参考答案很不错,值得参考!

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值