C++Primer练习与答案——3.3.3节
2016-09-10 15:07
288 查看
练习:
3.16:编写一段程序,把练习3.13中vector对象的容量和具体内容输出出来。检验你之前的回答是否正确,如果不对,回过头重新学习3.3.1节直到弄明白错在何处为止。
【解答】:
#include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<int> v1; vector<int> v2(10); vector<int> v3(10,42); vector<int> v4{10}; vector<int> v5{10, 42}; vector<string> v6{10}; vector<string> v7{10, "hi"}; cout << "v1的元素个数是:" << v1.size() << endl; if(v1.size() > 0) // 当vector含有元素时逐个输出 { cout << "v1的元素分别是:" << endl; for(auto e : v1) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } cout << "v2的元素个数是:" << v2.size() << endl; if(v2.size() > 0) // 当vector含有元素时逐个输出 { cout << "v2的元素分别是:" << endl; for(auto e : v2) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } cout << "v3的元素个数是:" << v3.size() << endl; if(v3.size() > 0) // 当vector含有元素时逐个输出 { cout << "v3的元素分别是:" << endl; for(auto e : v3) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } cout << "v4的元素个数是:" << v4.size() << endl; if(v4.size() > 0) // 当vector含有元素时逐个输出 { cout << "v4的元素分别是:" << endl; for(auto e : v4) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } cout << "v5的元素个数是:" << v5.size() << endl; if(v5.size() > 0) // 当vector含有元素时逐个输出 { cout << "v5的元素分别是:" << endl; for(auto e : v5) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } cout << "v6的元素个数是:" << v6.size() << endl; if(v6.size() > 0) // 当vector含有元素时逐个输出 { cout << "v6的元素分别是:" << endl; for(auto e : v6) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } cout << "v7的元素个数是:" << v7.size() << endl; if(v7.size() > 0) // 当vector含有元素时逐个输出 { cout << "v7的元素分别是:" << endl; for(auto e : v7) // 使用范围for语句遍历每一个元素 cout << e << " "; cout << endl; } return 0; }
3.17:从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写形式。输出改变后的结果,每个词占一行。
【解答】:
#include<iostream> #incl 4000 ude<vector> #include<string> using namespace std; int main() { vector<string> vString; // 元素类型为string的vector对象 string s; // 记录用户的输入值 char cont = 'y'; // 与用户交互,决定是否继续输入 cout << "请输入第一个词:" << endl; while(cin >> s) { vString.push_back(s); // 向vector对象中添加元素 cout << "您要继续吗(y or n)?" << endl; cin >> cont; if(cont !='y' && cont != 'Y') break; cout << "请输入下一个词:" << endl; } cout << "转换后的结果是:" << endl; for(auto &mem : vString) // 使用范围for循环语句遍历vString中的每个元素 { for(auto &c : mem) // 使用范围for循环语句遍历mem中的每个字符 c = toupper(c); // 改写为大写字母形式 cout << mem << endl; } return 0; }
3.18:下面的程序合法吗?如果不合法,你准备如何修改? vector<int> ivec; ivec[0] = 42;
【解答】:
该程序是非法的,因为ivec目前没有任何元素,因此ivec[0]的形式是错误的,程序试图访问的元素根本不存在。要想向vector对象中添加新元素,需要使用push_back函数。 下面是修改后的程序代码: vector<int> ivec; ivec.push_back(42);
3.19:如果想定义一个含有10个元素的vector对象,所有元素的值都是42,请列举三种不同的实现方法。哪种方法更好?为什么?
【解答】:
解决思路一:先定义一个空vector对象,然后添加元素 vector<int> vInt; for(int i = 0; i < 10; i++) vInt.push_back(42); 解决思路二:列表初始化,罗列出全部10个元素的值。 vector<int> vInt = {42,42,42,42,42,42,42,42,42,42}; 解决思路三:用括号给出所有元素的值,效果类似于解决思路二。 vector<int> vInt{42,42,42,42,42,42,42,42,42,42}; 解决思路四:定义的时候使用参数指定元素个数及重复的值。 vector<int> vInt(10, 42); 解决思路五:先指定元素个数,再利用范围for循环依次为元素赋值。 vector<int> vInt(10); for(auto &i : vInt) i = 42; 显然,思路四采用的初始化方式形式上最简洁直观,当vector对象的元素数量较多且取值重复时是最好的选择:而思路一在开始的时候不限定元素的个数,比较灵活。
3.20:读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。改写你的程序,这次要求先输出第一个和最后1个元素的和,接着输出第2个和倒数第2个元素的和,以此类推。
【解答】:
// 求相邻元素和的程序如下所示 #include <iostream> #include <vector> using namespace std; int main() { vector<int> vInt; int iVal; cout << "请输入一组数字:" << endl; while (cin >> iVal) vInt.push_back(iVal); if (vInt.size() == 0) { cout << "没有任何元素" << endl; return -1; } cout << "相邻两项的和依次是:" << endl; // 利用decltype判断i的类型 for (decltype(vInt.size()) i = 0; i < vInt.size() - 1; i += 2) { // 求相邻两项的和 cout << vInt[i] + vInt[i + 1] << " "; // 每行输出5个数字 if ((i + 2) % 10 == 0) cout << endl; } // 如果元素数是奇数,单独处理最后一个元素 if (vInt.size() % 2 != 0) cout << vInt[vInt.size() - 1]; return 0; }
#include <iostream> #include <vector> using namespace std; int main() { vector<int> vInt; int iVal; cout << "请输入一组数字:" << endl; while (cin >> iVal) vInt.push_back(iVal); if (vInt.size() == 0) { cout << "没有任何元素" << endl; return -1; } cout << "首尾两项的和依次是:" << endl; // 利用decltype判断i的类型 for (decltype(vInt.size()) i = 0; i < vInt.size() / 2; i++) { // 求相邻两项的和 cout << vInt[i] + vInt[vInt.size() - i - 1] << " "; // 每行输出5个数字 if ((i + 1) % 5 == 0) cout << endl; } // 如果元素数是奇数,单独处理最后一个元素 if (vInt.size() % 2 != 0) cout << vInt[vInt.size() / 2]; return 0; }
相关文章推荐
- C++primer(第五版)9.1节,9.2节,9.2.1节练习答案
- C++primer(第五版)9.2.2节,9.2.3节,9.2.4节练习答案
- C++primer(第五版)9.4节练习答案
- 从今天开始,把C++primer(第五版)的课后练习答案贴到我的博客里面
- c++primer第五版课后练习答案(第十章)
- C++primer(第五版)9.5.1节,9.5.2节,9.5.3节,9.5.5节,9.6节练习答案
- C++Primer练习与答案——3.1节
- C++primer(第五版)9.2.5节,9.2.7节练习答案
- C++Primer练习与答案——3.2.3节
- C++primer(第五版)8.2.2节练习答案
- C++primer(第五版)8.2.2节练习答案
- C++primer(第五版)9.3.1节,9.3.2节,9.3.3节练习答案
- C++primer(第五版)8.3.2节练习答案
- C++Primer练习与答案——3.3.2节
- C++primer第5版课后练习习题答案9.47
- c++primer第五版课后练习答案(第五章)
- c++primer第五版课后练习答案(第一章)
- C++Primer第五版 3.3.3节练习
- c++primer第五版课后练习答案(第六章)
- C++Primer练习与答案——3.3.1节