【C++ Primer】Part1·Day2 第三章 笔记及练习作答

学一门新的程序设计语言的最好方法就是不断地写代码。

using声明

  using namespace::name;
  通过上述语句声明,可以直接访问命名空间里对应的名字。一般来说,用到的每个语句都必须有自己的声明语句,每句话都得以分号结束。
  头文件不应该包含using声明,尽量不使用 using namespace std; 语句(可能产生名字冲突吧)。

标准库类型 String

  可变长的字符序列。
  相当于字符串char[],char[]字面值与string是不同类型。但允许使用字符串字面值初始化string对象。

  默认初始化string对象会得到一个空字符串;
  拷贝初始化:使用等号(=)初始化string对象;
  直接初始化:直接使用括号初始化对象。

  在执行std::cin读取操作时,string对象会自动忽略开头的空白(如空格、换行符、制表符等),读取字符直到下一处空白。可以通过 getline(cin,string) 读取输入流内容直到换行符为止,得到的对象不包括换行符。

  string 的 size 函数返回对象的长度,是一个 string::size_type 类型的值,是一个 unsigned 整型值。尽量在确保整型变量 n 大于等于0的情况下与 size 函数比较,避免带符号数负值到无符号数的转换。在C++11中允许编译通过 auto 或者 decltype 来推断这个类型。

  c_str函数返回一个C风格的字符串指针。

部分判断string对象中字符的函数(头文件cctype)
isalnum(s) 当 s 是字母或数字时为真isspace(s) 当 s 是空白时为真
isalpha(s) 当 s 是字母时为真isdigit(s) 当 s 是数字时为真
islower(s) 当 s 是小写字母时为真isupper(s) 当 s 是大写字母时为真
tolower(s) 将 s 转为小写字母toupper(s) 将 s 转为大写字母

标准库类型 vector

  一个对象的集合,所有对象类型相同。可以称为容器。

  默认初始化。
  列表初始化:将花括号括起来的0个或多个初始元素赋给vector对象。
  值初始化:如vector<int> a(10);,10个元素,每个都初始化为0。
  数组初始化:指明数组拷贝区域的首地址元素和尾后地址元素即可。

数组

  类似于vector。大小固定,初始化必须声明维度(元素个数),使用列表初始化时允许忽略维度。字符数组的尾元素是一个空字符(’\0’)。两个数组间不能拷贝也不能赋值。
  允许定义数组的指针 / 引用。

  数组下标的类型为 size_t 类型,是一种无符号类型。

------------------------------------------ \ 我 是 分 割 线 / ------------------------------------------

小昭 の 练习作答

3.1 略
3.2

string str;
while(getline(cin,str)) cout << str << endl;
while(cin << str) cout << str << endl;			// 通过 Ctrl+z 和 Enter回车 结束while循环

3.3 略
3.4

string s1,s2;
cin << s1 << s2;
if(s1 != s2) cout << "不相等" << endl;
else if(s1 < s2) cout << s2 << endl;
else cout << s1 << endl;

if(s1.size() != s2.size()) cout << "不相等" << endl;
else if(s1.size() < s2.size()) cout << s2 << endl;
else cout << s1 << endl;

3.5

string s,res1,res2;
while(cin >> s) res1 += s;		// 大字符串
while(cin >> s) res2 += s + " ";// 空格分开的大字符串

3.6

string s;
for(auto &c : s) c = 'X';

3.7 没影响。
3.8

string s1 = "xxx",s2 = "xxx";
for(auto i = 0;i < s1.size();++i) s1[i] = 'X';
int i = 0; while(i < s2.size()) s2[i++] = 'X';

3.9 不合法(不知道为什么VS2019不报错)。s[0]的意思是取 s 的第一个字符,而 s 为空。
3.10

string s1,s2;
cin >> s1;
for(auto c : s1){
	if(!ispunct(c)) s2 += c;
}
cout << s2 << endl;

3.11 不合法。
3.12 (a) 正确;(b) 不正确,容器内置类型不匹配;© 正确。
3.13 空,10个0,10个整数42,1个10,10 与 42,10个"",10个"Hi"。
3.14~3.15

int i;string s;
vector<int> v1;vector<string> v2;
while(cin >> i) v1.push_back(i);
while(cin >> s) v1.push_back(s);

3.16 for(auto c : s) cout << c << " "; s为任意vector对象。
3.17

string s;vector<string> v;
while(cin >> s) {
	for(auto &c : s) c = toupper(c);
	v.push_back(s);
}
for(auto c : v) cout << c << " ";

3.18 不合法,第二行修改为 ivec.push_back(42);
3.19 略
3.20

int i;vector<int> v;
while(cin >> i) v.push_back(i);
for(int i = 0;i < v.size()/2;++i) cout << v[i] + v[v.size() - i - 1] << endl;

3.21~3.25 迭代器相关 暂时咕。
3.26 防止两个大数相加溢出。
3.27 © 不合法,txt_size()不是常量表达式;(d) 不合法,超出元素个数。
3.28 略
3.29 不能增加元素,灵活性不高…
3.30 略
3.31~3.32

int a[10],b[10];
for(int i = 0;i < 10;++i) a[i] = i;
for(int i = 0;i < 10;++i) b[i] = a[i];
// vector版 略

3.33 报错。
3.34 相当于 p1 = p2;
3.35~3.36

int a[] = {1,2,3},*p = begin(a);
while(p != end(a)) *(p++) = 0;

int a[] = {1,2,3},b[] = {1,2,3};
int *ap = begin(a),*bp = begin(b);
if(sizeof(a) / sizeof(a[0]) != sizeof(b) / sizeof(b[0])) cout << "不相等" << endl;
else{
	while(ap != end(a)){
		if(*ap != *bp) {
			cout << "不相等" << endl;
			break;
		} 
	}
	cout<< "前面没有不相等,那就相等啦 " << endl;
}
// vector版 略

3.37 输出hello以及乱码。
3.38 指针中存放的是地址,两个指针相加等于两个地址相加,得到的是一个未知地址。
3.39~3.42 略
3.43

int ia[3][4] = { {0,1,2,3},{0,1,2,3},{0,1,2,3} };

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 (*i)[4] = begin(ia);i < end(ia);++i){ 
	for(int *j = begin(*i);j < end(*i);++j) 
		cout << *j  << " "; 
} cout << endl;

3.44~45 例题抄一遍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值