您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息